Java-кнопки, события и слушатели - PullRequest
0 голосов
/ 28 мая 2018

В настоящее время я работаю над графическим интерфейсом для системы управления проектами.

Не могу понять, как заставить событие Action работать правильно.

Следующие строки кодачто я использую для двоих.

    public  JPanel setupButtons(User u){

        JPanel forButtons = new JPanel();
ButtonGroup group = new ButtonGroup();

        for(int i = 0; i != u.projectSize(); i++){
            this.jRdBttn = new JRadioButton(u.getProject(i).getName());
            forButtons.add(jRdBttn);
            group.add(jRdBttn);

            jRdBttn.addActionListener(this);
            jRdBttn.setEnabled(true);
        }



    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if(e.getSource() == select){
            if(this.jRdBttn.isSelected()){
                System.out.println("It worked!!");
            }
        }
    }
}

Просто нужно выяснить, какая проблема у меня возникла с прослушивателем действий и действием событий.

1 Ответ

0 голосов
/ 28 мая 2018

Предполагая, что это весь код, который имеет какое-либо отношение к вашему ActionListener, вот ваш ответ:

Вы отдаете все свои RadioButtons и ActionListener.Который, конечно, будет вызван, когда нажмете РАДИО КНОПКИ .Однако в этих случаях источником события будет никогда , а не другая кнопка с именем select.

Вы, кажется, хотите позвонить своему ActionListener, когда кнопка selectнажата.Это означает, что для кнопки нужен ActionListener, а не ваша RadioButtons.

. Примечание:

this.jRdBttn = new JRadioButton(u.getProject(i).getName());

Это будет означать, что this.jRdBttn будет содержать толькосамый последний RadioButton, который вы создали в конце этого цикла.Все остальные будут потеряны навсегда, так как у вас больше нет прямых ссылок на них (конечно, у вас все еще есть их в иерархии компонентов, но когда-нибудь использовать их таким способом будет болезненно).

-- Изменить 29.05.2018 ---

Если вы хотите реагировать каждый раз, когда нажимается радиокнопка (что, я думаю, вы подразумеваете под своим комментарием), без необходимости в кнопке выбора, будетнесколько способов добиться этого.

Какой способ использования вы в значительной степени используете, зависит от вашего варианта использования.

Если мы попытаемся максимально приблизиться к вашему текущему подходу, нам может потребоваться сохранитьвсе ваши RadioButtons в массиве, а затем перебрать этот массив, чтобы найти выбранную в данный момент кнопку.Вам даже не нужно было бы смотреть на ActionEvent или его источник, так как на самом деле вам все равно, какая кнопка RadioButton была нажата, а какая только выбрана в данный момент.

Конечно, вы можете утверждать, что кнопкаэто было просто нажатие - это тот, который был выбран, но с вашим текущим подходом вам все равно придется перебирать массив, чтобы найти индекс (который, как я полагаю, вам может понадобиться для доступа к соответствующему проекту), что делает его бессмысленным.

Итак, первый шаг: добавьте в свой класс:

private JRadioButton[] radioButtons;

Далее:

public  JPanel setupButtons(User u){

    JPanel forButtons = new JPanel();
    ButtonGroup group = new ButtonGroup();
    radioButtons = new JRadioButton[u.projectSize()]; // <- This is new

    for(int i = 0; i != u.projectSize(); i++){
        radioButtons[i] = new JRadioButton(u.getProject(i).getName());
        forButtons.add(radioButtons[i]);
        group.add(radioButtons[i]);

        radioButtons[i].addActionListener(this);
        radioButtons[i].setEnabled(true);
    }
}

И последнее, но не менее важное:

public void actionPerformed(ActionEvent e) {
    for (int i = 0; i < radioButtons.length; i++) {
         if (radioButtons[i].isSelected()) {
             System.out.println("Button " + i + " was selected!");
             // Optionally, you might want to put a break; here
         }
    }
}
...