Эффективность Java-кодирования.Объекты JRadioButton и взаимодействие ItemListener - PullRequest
0 голосов
/ 12 декабря 2018

Я недавно начал программировать на Java.Я хотел закодировать Окно, которое содержит:

  • 1 Frame
  • 1 Контейнер
  • 2 JPanel объекты (чтобы не путать Panels, Container и Frame объект)
  • 1 Объект Scroll
  • 1 JTextArea и 1 JTextField
  • 1 JButtonGroup с 3 ассоциированными JRadioButton

Его назначение походило на одного человекачат.Напишите в TextField, кнопку отправки и распечатайте его в TextArea, добавляя к любому предыдущему сообщению.Следующим шагом я назвал 3 радиокнопки «Пользователь 1», «Пользователь 2» и «Пользователь 3». При их выборе они напечатают: user_x.GetName + (String);

Моей первой попыткой был ActionListener.(Это прототип):

    ActionListener updateUserTalking = new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent arg0) {
        JTextField tf = textField; //New message
        JTextArea ta = textArea; //Previous message to track an history
        String str = ta.getText()+"Radio button changed"; //This should print "User_x"
        str = str+tf.setText(str+System.lineSeparator());
    }
};

Моя вторая попытка была ItemListener.(Это прототип)

    public void itemStateChanged(ItemEvent e) {
        updateSystemMessage();  

Это updateSystemMessage () вызывает этот метод:

    ItemListener updateSystemMessage = new ItemListener(){
    public void itemStateChanged(ItemEvent e) {
        JTextField tf = textField; //New message
        JTextArea ta = textArea; //Previous message to track an history
        String str = ta.getText()+"RadioButton changed"; //This should print "User_x"
        str = str+tf.setText(str+System.lineSeparator());
    }
};

В последнем выводится двойное сообщение.Потому что тот же метод является общим.Таким образом, при изменении выбора есть две коммутации, поэтому этот метод будет вызываться дважды.Вот мой вопрос:

Я знаю, что могу сделать по одному методу для каждого объекта JRadioButton.Я догадывался, есть ли способ сделать жизнеспособным уникальный метод.Там, где выбранный JRadioButton присваивает свое имя в качестве параметра ActionListener или ItemListener.

Я уже пробовал что-то вроде этого:

   private void updateSystemMessage() {
    JRadioButton jrb = (JRadioButton)this.bGroup.getSelection();
    this.system =jrb.getText();
}

Но это не работает, потому что bGroup.getSelection () возвращаетButtonModel, который не может быть приведен как (JRadioButton).Поэтому есть ли такой способ?Или я должен написать один метод для каждого JRadioButton (кто в основном делает то же самое)?

1 Ответ

0 голосов
/ 13 декабря 2018

ActionEvent.getSource () вернет JRadioButton, сгенерированный в, так что вы можете

ActionListener updateUserTalking = new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
    JTextField tf = textField; //New message
    JTextArea ta = textArea; //Previous message to track an history
    JRadioButton jrb = (JRadioButton) arg0.getSource();
    String str = ta.getText()+"Button "+jrb.getLabel();
    str = str+tf.setText(str+System.lineSeparator());
}

Или вы получите вызов JRadioButton.setActionCommand ("button1"), а затем используйте ActionEvent.getActionCommand () дляпередайте уникальную строку для каждой кнопки.

JRadioButton user1 = new JRadioButton("User_1");
user1.setActionCommand("User_1");

ActionListener updateUserTalking = new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
    JTextField tf = textField; //New message
    JTextArea ta = textArea; //Previous message to track an history
    String cmd = arg0.getActionCommand();
    String str = ta.getText()+"Button "+cmd;
    str = str+tf.setText(str+System.lineSeparator());
}

Или вы можете использовать actionCommand с ButtonModel.

private void updateSystemMessage() {
    String actionCommand = this.bGroup.getSelection().getActionCommand();
    this.system = actionCommand;
}
...