Почему extends JFrame implements ActionListener
плохое дизайнерское решение?Подкласс JFrame и реализация интерфейса ActionListener
ответ
Пара очков:
- Расширение
JFrame
, вероятно, неправильный подход - Реализация
ActionListener
на качествеJFrame
, вероятно, приведет к не-ООП кода.
Неправильный подход?
Если идея заключается в том, что приложение GUI выполняется, то одно не делает расширение JFrame
, но фактически записывает приложение.
Следовательно, JFrame
будет частью приложения, а не самого приложения. Следовательно, JFrame
должен быть объектом класса.
Реализация ActionListener
на качестве JFrame
, вероятно, приведет к не-ООП код
Рассмотрим следующий случай - в качестве приложения с графическим интерфейсом начинает получать большие, и мы начинаем добавлять множество кнопок и меню, которые дают начало ActionEvent
с.
Если бы JFrame
сам должен был получить события, тогда как выглядел бы метод actionPerformed
?
Вероятно, что-то вроде этого:
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
// Find out which component fired the event
if (source == masterButton) {
// ... do something
} else if (source == anotherButton) {
// ... do something else
} else if (...)
// ... and so on ...
} else if (...)
// ... and so on ...
}
}
Хлоп.
Мы собираемся начать получать код, который тесно связан со всеми компонентами приложения, а ремонтопригодность будет выходить из окна в мгновение ока.
Если, например, приложение GUI были экземпляры ActionLister
с которой ответили на каждый компонент, то мы сможем разбить действия и связь метода actionPerformed
со всеми компонентами в GUI.
Например:
JButton masterButton = new JButton();
masterButton.addActionListener(new MasterButtonActionListener());
JButton anotherButton = new JButton();
anotherButton.addActionListener(new AnotherButtonActionListener());
Таким образом, будет ActionListeners
для каждой кнопки, которые предположительно имеют различные функциональные возможности. Ответ MasterButtonActionListener
должен обрабатывать события от masterButton
- он не должен знать о других кнопках в приложении.
Кроме того, это будет способствовать повторному использованию компонентов в других приложениях или другой части приложения без необходимости копировать и = вставлять части монолитного оператора if-else
в метод actionPerformed
.
Если вы читаете Effective Java, пункт 16 гласит:
"Фавор композиции над Наследование"
. Прочитайте объяснение, данное here
Привет, Амир, не могли бы вы сказать, что это более простой способ? Я очень ржавый с синтаксисом JAVA, поэтому один наследуется от другого, но это плохая идея, потому что это «обычный конкретный класс». – JHarley1
Привет JHarley - то, что он говорит о том, что не наследует от обычного конкретного класса из другого пакета, просто состоит в том, что изменения в этом классе будут напрямую влиять на ваши. Если вы сохранили ссылку на JFrame, вы можете инкапсулировать ее поведение - с подкассой вы не можете. –
Я считаю, что это плохой дизайн .. Потому что, вы смешиваете код контроллера с видом .. если вы хотите следовать шаблону MVC, вы не должны смешивать их ..
Кроме того, A JFrame
обычно не получает действий. Его дочерние объекты будут благотворителями ActionEvent
.
Лучше и более OO-подход состоит в том, чтобы иметь отдельные объекты Action. Это позволяет отделить функциональность и состояние от компонента. Это делает ваш код повторно используемым, потому что вы можете использовать одно и то же действие как на кнопке, так и в элементе меню, например.
Пример:
class ExitAction extends AbstractAction{
public ExitAction(){
super("Exit");
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Exiting");
}
}
JButton exitButton = new JButton(new ExitAction());
Посмотрите на How to Use Actions в Java Tutorial:
- 1. JFrame и ActionListener
- 2. JFrame и ActionListener JPanel
- 3. JFrame - ActionListener
- 4. Реализация и вызов класса JFrame/ActionListener из основного
- 5. ActionListener не Реализация
- 6. Реализация ActionListener в Java
- 7. Реализация интерфейса, но возвращающий подкласс возвращаемого типа?
- 8. JFrame, toFront(), ActionListener
- 9. JFrame не откроется через ActionListener
- 10. Реализация ActionListener к JTextField
- 11. Открытие нового JFrame изнутри actionListener
- 12. Реализация игрового графического интерфейса
- 13. Сделка и реализация интерфейса
- 14. Реализация Singleton и интерфейса
- 15. Расширение и реализация интерфейса
- 16. реализация интерфейса и LinkedList
- 17. реализация actionListener с классами mulitple?
- 18. Реализация кнопки очистки для JFrame
- 19. Реализация ActionListener в детстве JButton
- 20. Сериализация JFrame удаляет ActionListener JButton - Java
- 21. обновить jFrame с помощью JButton ActionListener
- 22. Выбрасывание исключений и реализация через подкласс
- 23. Реализация ActionListener в следующем коде Внутри
- 24. реализация интерфейса
- 25. ActionListener вложен в ActionListener?
- 26. Java-классы и реализация интерфейса
- 27. Реализация интерфейса DataItem.DataListener и WearableListenerService
- 28. расширение класса и реализация интерфейса
- 29. Реализация интерфейса передачи и хранения
- 30. Неявная и явная реализация интерфейса
Является ли это домашнее задание? –
@ Дэйв Джарвис: Нет, это языковой вопрос для языка, который я не понимаю. – JHarley1