6

我已经开发 Java 程序 1.5 年了。我目前正在做一个暑期项目,其中涉及到相当大的图形用户界面。

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

现在,我已经到了一个点,在我的选项卡式窗格类中有这么多匿名内部类(用于 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;                          
        }
    }     
}

或者可能有更好的方法?

提前致谢 :)

4

6 回答 6

5

您可以尝试以下方法:

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

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

如果某一天之后有人必须维护 Listener,他/她可以通过首先查找适合 UseCase 的包然后查找 UseCase 本身来找到 Listener。由于您将拥有比 Classes 更少的包,因此找到 Listener 会更容易和更快。


另一种思考方式:如果您在一个选项卡上有这么多事件,在代码中组织它们时遇到问题,您如何在选项卡上直观地组织它们?你能以符合人体工程学的方式为用户处理吗?也许解决方案可能是将功能拆分到多个选项卡上?但是因为我不知道你的用户界面,所以我不能说太多

于 2013-08-22T17:07:58.247 回答
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);
    }
}
于 2013-08-22T16:50:43.243 回答
3

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

Per me (hovercraft):不一定是 Spring,因为 Guice 可以正常工作。它可以很好地配合treeno 的建议以及Tim Herold 的建议(对他们来说都是1+)。这一切都是为了尽可能地放松耦合和收紧内聚。

于 2013-08-22T21:11:25.250 回答
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;                          
        }
    }     
}
于 2013-08-22T21:38:52.433 回答
2

在某些时候,匿名内部类会从“方便”变成一团糟。你已经通过了这一点。

和 Tim 一样,我建议你使用 AbstractAction。然而,为了扩展,创建您自己的抽象子类,它可以从配置文件中读取其名称、图标、描述(用于工具提示)等。这样您就可以将代码国际化,而其他人(营销)可以轻松地将按钮从“保存”更改为“SuperSomethingTM”或其他。并且图形艺术家可以轻松地修改图标。为实际实现扩展这个类。

AbstractAction 的另一个优点是它们可以被禁用。因此,如果没有要保存的更改,您可以轻松禁用保存菜单、保存按钮和工具栏中的保存图标。

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

(在我的 Nook 上输入,所以这是短边,其他人可以随意扩展)

于 2013-08-22T17:06:23.607 回答
1

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

于 2013-08-22T17:44:27.080 回答