Java,大型GUI类,包含许多ActionListeners;组织听众的最佳方式?

时间:2013-08-22 16:44:09

标签: java swing actionlistener

我一直在开发Java程序1年半。我目前正在开展夏季项目,涉及相当大的图形用户界面。

我的GUI由几个选项卡式窗格组成。每个窗格都有自己的类。每个窗格都有几个jButtons。

现在,我已经到了一个点,在我的选项卡式窗格类中有很多匿名内部类(对于ActionListeners),我确信必须有更好的方法;如果不是为了效率,那么为了可维护性 - 它变得非常混乱。

我的问题是:当你在每个班级中有很多听众时,是否有更好的组织听众?我已经考虑过在相关类中集中监听器 - 比如下面的示例代码:

public class SomeListeners implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e){
        String command = e.getActionCommand();
        switch(command){
            case "This button":
                doThis();
                break;
            case "That button":
                doThat();
                break;                          
        }
    }     
}

或者可能有更好的方法?

提前致谢:)

6 个答案:

答案 0 :(得分:5)

您可以尝试以下方法:

使用真实类而不是匿名类。每个ListenerClass只实现一个用例/功能。 Classname应该描述UseCase。然后,您可以在一个或多个包中组织类,以便按照适合包中监听器实现的用例的类别对它们进行聚类。

这意味着,您创建了一个抽象层次结构,它将功能组织为树结构。

如果某天有人必须维护听众,他/她可以通过首先查找适合UseCase的包然后找到UseCase本身来找到Listener。由于您将拥有更少的包,因此可以更轻松,更快地找到监听器。


另一种思考方式:如果你在一个标签上有如此多的事件,那就得到了 在代码中组织它们的问题,如何在Tab上直观地组织它们?你能以符合人体工程学的方式为用户处理吗?也许解决方案可能是在多个Tab上拆分功能?但由于我不知道你的用户界面我不能说太多关于那个

答案 1 :(得分:4)

我建议使用javax.swing.AbstractAction

类型的单个类

示例:

Action leftAction = new LeftAction(); //LeftAction code is shown later
...
button = new JButton(leftAction)
...
menuItem = new JMenuItem(leftAction);

leftAction = new LeftAction("Go left", anIcon,
         "This is the left button.",
         new Integer(KeyEvent.VK_L));

...

class LeftAction extends AbstractAction {
    public LeftAction(String text, ImageIcon icon,
                      String desc, Integer mnemonic) {
        super(text, icon);
        putValue(SHORT_DESCRIPTION, desc);
        putValue(MNEMONIC_KEY, mnemonic);
    }
    public void actionPerformed(ActionEvent e) {
        displayResult("Action for first button/menu item", e);
    }
}

答案 2 :(得分:3)

Per duffymo:使用依赖注入并传入Listeners。这将使您有机会随意重复使用和更改它们。

Per me(气垫船):它不一定是春天,因为Guice可以正常工作。它可以很好地适应treeno的建议以及Tim Herold的建议(两者都是1+)。这一切都是为了尽可能地松开耦合和收紧内聚力。

答案 3 :(得分:2)

在某些时候,匿名的内部课程从“方便”变为邪恶的混乱。你已经超越了这一点。

和Tim一样,我建议你使用AbstractAction。但是,要进行扩展,请创建自己的抽象子类,该子类可以从配置文件中读取其名称,图标,描述(用于工具提示)等。通过这种方式,您可以将代码国际化,而其他人(营销)可以轻松地将按钮从“保存”更改为“SuperSomethingTM”或其他任何内容。图形艺术家可以轻松修改图标。为实际实现扩展此类。

AbstractAction的一个额外优势是可以禁用它们。因此,如果没有要保存的更改,您可以轻松地禁用工具栏中的“保存”菜单,“保存”按钮和“保存”图标。

有多种方法可以存储和读取此配置信息。一个是ResourceBundle。

(输入我的Nook所以这是短边,其他人可以自由扩展)

答案 4 :(得分:2)

像这段代码

public class SomeListeners implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e){
        String command = e.getActionCommand();
        switch(command){
            case "This button":
                doThis();
                break;
            case "That button":
                doThat();
                break;                          
        }
    }     
}

答案 5 :(得分:1)

JSR 296旨在为您正在做的事情以及此处提到的许多其他事项(i18n,Actions等)提供框架。最活跃的实现是Better Swing Application Framework或BSAF。可以找到关于如何使用任何JSR 296实现的好文章here