为什么extends JFrame implements ActionListener
是一个糟糕的设计决定?
答案 0 :(得分:3)
几点:
JFrame
可能是一种错误的做法ActionListener
上实施JFrame
可能会导致非OOP代码。错误的做法?
如果想法是创建一个GUI应用程序,那么,一个人不会扩展JFrame
,而是实际编写一个应用程序。
因此,JFrame
将成为应用程序的一部分,而不是应用程序本身。因此,JFrame
应该是类中的对象。
在ActionListener
上实施JFrame
可能会导致非OOP代码
考虑以下情况 - 随着GUI应用程序开始变大,我们开始添加大量按钮和菜单,这些按钮和菜单会产生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
语句的部分。
答案 1 :(得分:1)
答案 2 :(得分:0)
我认为这是一个糟糕的设计..因为,你将控制器代码与视图混合..如果你想跟随mvc模式,你不应该混合它们。
答案 3 :(得分:0)
此外,A JFrame
通常不会收到操作。它的子对象将是ActionEvent
的恩人。
答案 4 :(得分:0)
更好的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());
在Java教程中查看How to Use Actions: