为什么extends JFrame implements ActionListener
是一个糟糕的设计决策?JFrame子类和ActionListener接口实现
回答
有几点:
- 扩展一个
JFrame
可能是一个错误的做法 - 实现上
JFrame
的ActionListener
可能会导致非面向对象的代码。
错误的方法?
如果这个想法是一个GUI应用程序正在制作,那么,一个不是JFrame
的扩展,但实际上是编写一个应用程序。
因此,JFrame
将成为应用程序的一部分,而不是应用程序本身。因此,JFrame
应该是班级中的一个对象。
实现上JFrame
的ActionListener
可能会导致非面向对象的代码
考虑以下情况 - 作为GUI应用程序开始变得很大,而且我们已经开始添加大量的按钮和导致ActionEvent
s的菜单。
如果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
S的回应每一个组件实例,那么我们就能够向上突破actionPerformed
方法的动作和连接用的所有组件GUI。
例如:
JButton masterButton = new JButton();
masterButton.addActionListener(new MasterButtonActionListener());
JButton anotherButton = new JButton();
anotherButton.addActionListener(new AnotherButtonActionListener());
这种方式,将有ActionListeners
为每个按钮这大概具有不同的功能。 MasterButtonActionListener
的责任是处理来自masterButton
的事件 - 它不必知道应用程序中的其他按钮。此外,这将促进组件在其他应用程序或应用程序的其他部分的可重用性,而不必复制并粘贴actionPerformed
方法中的单片if-else
语句的部分。
的解释,我认为这是一个不好的设计。因为,你有看法混合控制器代码..如果你想跟随MVC模式,你不应该将它们混合..
此外, A JFrame
通常不会收到操作。它的子对象将是ActionEvent
的恩人。
一个更好,更多的面向对象的方法将是有单独的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());
您可以在Java教程一看How to Use Actions:
- 1. JFrame ActionListener
- 2. 在子接口或实现类
- 3. 强制接口的子类实现ToString
- 4. 实现与子类的接口
- 5. 类设计:类实现接口实现另一个接口
- 6. 实现和接口
- 7. 实现接口的类和genric对象
- 8. 实现接口的MySql和SQlite类
- 9. 匿名类实现接口
- 10. 抽象类实现接口
- 11. 接口实现时不透露实现接口的类
- 12. JFrame的keylistener与actionlistener
- 13. 实现和接口已由超类实现?
- 14. 扩展和实现接口
- 15. Java接口和实现
- 16. 困惑接口和实现
- 17. 接口实现和LinkedList
- 18. 为ActionListener按钮实现2个类
- 19. 如何在ActionListener中实现一个类?
- 20. 实现ActionListener的Java匿名类?
- 21. 是否有即使父类实现相同的接口实现子类中的接口任何好处
- 22. 子类是否导致类停止实现接口?
- 23. C#实现接口方法与子类类型的参数
- 24. 使用子类替换未实现接口的Java类
- 25. 接口实现
- 26. 实现接口
- 27. 实现接口
- 28. 实现接口
- 29. 实施接口错误:类不实现接口成员
- 30. 将接口实例分配给实现该接口的类
这是一个家庭作业? – 2011-01-05 17:00:28
@Dave Jarvis:不,这是针对我不懂的语言的特定语言问题。 – JHarley1 2011-01-05 17:02:51