Определите и ActionListener в классе, который расширяет кнопку - PullRequest
0 голосов
/ 30 мая 2018

Как разместить Action Listener непосредственно в определении класса, который расширяется Button?

Если объект класса Button создан, то мы могли бы просто использовать анонимный внутренний класс:

b = new Button("Click me");
b.addActionListener(
                    new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                            System.out.println("stringToPrint");
                        }
                    }
                );

how to do the same in below :
class CustomizedButton extends Button{
   String customClass;

   Button(String stringToPrint){
      super(customClass); //customClass is also button name
      this customString = stringToPrint;
   }

   /*this.addActionListener( //don't work this way
       new ActionListener(){
            public void actionPerformed(ActionEvent e){
                System.out.println(customClass);//use outer(?) field
            }
        }
     );*/
}

Мне нужно создать 20 почти идентичных, но немного разных кнопок, чтобы анонимный внутренний объект был слишком длинным

1 Ответ

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

Вы можете объявить закрытый вложенный класс, например так:

public class CustomizedButton extends Button{
    String customClass;

    CustomizedButton(String stringToPrint){
        super(customClass); //customClass is also button name
        this.customString = stringToPrint;
        addActionListener(new MyListener());
    }

    private class MyListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO: listener code here
        }
    }
}

Но это не сильно отличается от использования анонимного внутреннего класса или лямбды:

public class CustomizedButton extends Button{
    String customClass;

    CustomizedButton(String stringToPrint){
        super(customClass); //customClass is also button name
        this.customString = stringToPrint;
        addActionListener(e -> myListenerCode(e));
    }

    private void myListenerCode(ActionEvent e) {
        // TODO: listener code here
    }

}

Сказав это,на ум приходят другие вопросы:

  • Обычно лучше отдать предпочтение композиции, а не наследованию.Могу поспорить, что вы действительно хотите, это какой-то фабричный метод, который создает вашу кнопку в комплекте со слушателем
  • Зачем использовать компоненты AWT, такие как класс java.awt.Button, когда он равен 20+ устарели?Почему бы не использовать Swing JButtons вместо этого?
  • Если бы вы использовали Swing JButtons, лучше было бы создать собственное действие, а не расширять JButton.Действия могут содержать и изменять многие свойства кнопок, включая прослушиватель, отображаемый текст, значки, текст всплывающей подсказки (отображается при наведении курсора) ....
  • В этом отношении вам следует отдать предпочтение JavaFX, если этоновый проект, поскольку это текущая наиболее поддерживаемая библиотека графического интерфейса Java.

Например, класс AbstractAction может выглядеть примерно так:

public class CustomizedAction extends AbstractAction{
    String text;

    CustomizedAction(String text, int mnemonic){
        super(text); //text is also button name
        this.text = text;
        putValue(MNEMONIC_KEY, mnemonic); // for alt-key short cut if desired
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String currentName = getValue(NAME); // same value as the text field
        System.out.println(currentName);

        // TODO: more listener code here
    }

}

и может использоваться следующим образом:

JButton button = new JButton(new CustomizedAction("Foo", KeyEvent.VK_F));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...