JFrame子类和ActionListener接口实现

时间:2011-01-05 16:57:07

标签: java programming-languages

为什么extends JFrame implements ActionListener是一个糟糕的设计决定?

5 个答案:

答案 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)

如果您阅读Effective Java,则第16项规定:

  

赞成合成而不是继承

。阅读here

给出的解释

答案 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