2011-01-05 116 views
1

为什么extends JFrame implements ActionListener是一个糟糕的设计决策?JFrame子类和ActionListener接口实现

+0

这是一个家庭作业? – 2011-01-05 17:00:28

+0

@Dave Jarvis:不,这是针对我不懂的语言的特定语言问题。 – JHarley1 2011-01-05 17:02:51

回答

3

有几点:

  • 扩展一个JFrame可能是一个错误的做法
  • 实现上JFrameActionListener可能会导致非面向对象的代码。

错误的方法?

如果这个想法是一个GUI应用程序正在制作,那么,一个不是JFrame的扩展,但实际上是编写一个应用程序。

因此,JFrame将成为应用程序的一部分,而不是应用程序本身。因此,JFrame应该是班级中的一个对象。

实现上JFrameActionListener可能会导致非面向对象的代码

考虑以下情况 - 作为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语句的部分。

+0

如果只有我可以对此进行百万次提升。 – Tansir1 2011-01-05 17:20:06

+0

Coolbird感谢您花时间发布这样的详细解释。 – JHarley1 2011-01-05 17:20:14

+0

@ Tansir1:谢谢:) – coobird 2011-01-05 17:21:34

1

如果你读了有效的Java,项目16个州:

“过的传承青睐组成”。阅读给定here

+0

你好阿米尔,你可能会说这是一个更简单的方法吗?我用我的JAVA语法非常生疏 - 所以我从另一个继承 - 但这是一个坏主意,因为它是一个'普通具体类'。 – JHarley1 2011-01-05 17:14:05

+0

嗨JHarley--他在那里谈论的不是从一个普通的具体课程继承另一个课程,只是这个课程的变化会直接影响到你的。如果你保留了一个JFrame的引用,你可以封装它的行为 - 用sublcassing,你不能。 – 2011-01-05 17:19:22

0

的解释,我认为这是一个不好的设计。因为,你有看法混合控制器代码..如果你想跟随MVC模式,你不应该将它们混合..

0

此外, A JFrame通常不会收到操作。它的子对象将是ActionEvent的恩人。

0

一个更好,更多的面向对象的方法将是有单独的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