在GUI组件上使用可重用操作的最佳实践

时间:2011-09-28 11:37:26

标签: java swing action

我尝试了如何在Swing应用程序中使Action可恢复的不同之处。我不是重量级,1000多个线类(有很多内部/非类)的朋友,并尝试将我的代码分成多个类。从而使它们易于重复使用和交换。

对于重复使用相同的操作,我在每个Action自己的类中为 JMenuBar和JToolBar 使用它。请看下面的最小例子。

这是一个很好的选择练习(尤其是使用静态内部类)?

public class SomeGUI extends JFrame {

    public static void main(String[] args)
    {
        new SomeGUI();
    }

    public SomeGUI()
    {
        setJMenuBar(new MyMenuBar());
        add(new MyToolBar());

        setSize(400, 400);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

}

class MyMenuBar extends JMenuBar {

    JMenu menu = new JMenu("File");

    public MyMenuBar()
    {
        add(menu);
        menu.add(new JMenuItem(new Actions.NewAction("New", null, "New File", KeyEvent.VK_N)));
    }

}

class MyToolBar extends JToolBar {

    public MyToolBar()
    {
        add(new Actions.NewAction("New", null, "New File", KeyEvent.VK_N));
    }

}

class Actions {

    static class NewAction extends AbstractAction {
        public NewAction(String name, ImageIcon icon, String desc, Integer mnemonic)
        {
            super(name, icon);
            putValue(SHORT_DESCRIPTION, desc);
            putValue(MNEMONIC_KEY, mnemonic);
        }

        @Override
        public void actionPerformed(ActionEvent paramActionEvent)
        {
            System.out.println("do the new action...");
        }
    }

}

期待您的建议。提前谢谢。

3 个答案:

答案 0 :(得分:2)

一个建议是不要使用包含所有操作的聚合类。只需为每个类使用单独的文件并将其公开。

这种在另一个项目中使用该类的方法,只需要在当前项目中没有特定依赖项的情况下复制该文件。

答案 1 :(得分:2)

  

这是一个很好的选择练习(尤其是使用静态内部类)?

这是实现大部分基本Swing代码的方式。

例如,看一下DefaultEditorKit的源代码,其中定义了所有的Action。

答案 2 :(得分:1)

我经常做的事情(在guts-gui项目中使用GutsAction时更容易)是我将相关操作分组到一个类中。

我将每个操作存储为final public字段(但是如果您讨厌public字段,您仍然可以将它们private设置为JTable并在每个字段上定义一个getter方法。

每个动作都被定义为一个很小的匿名类,其中声明了最后一个字段。

分组标准本质上是有效的,但它们也可以包括一些背景,例如:你可以有一个包含在当前所选订单上执行的各种操作的类(来自订单{{1}}),因此我可以将上下文(当前所选订单)放在一个类中,我也可以放在那里选择更改时启用/禁用所有操作的必要方法。

将操作分组到一个类中有助于避免遍布整个地方的操作类扩散,并且必须管理每个单独操作的实例化。它还可以更轻松地依赖注入几个操作共有的依赖关系。