【问题标题】:How can I place @Action methods in a separate class from a Swing component?如何将 @Action 方法放在与 Swing 组件不同的类中?
【发布时间】:2010-02-01 17:53:10
【问题描述】:

在开发 Swing 应用程序时,我通常为每个 UI 组件定义一个委托接口,用于操作回调。例如,如果有一个类MyDialog,其中包含一个按钮MyButton,那么MyButtonActionListener 将调用MyDialog.Delegate.OnMyButtonClick(Event e)。 UI 组件然后变得“哑”,需要一个控制器来处理事件以及更新组件本身。

我认为通过使用 Swing 应用程序框架的 @Actions,我可以通过在实现类中定义 @Action 方法来绕过创建委托接口和实现,让 ApplicationContext 弄清楚要调用什么。显然,情况并非如此,因为我没有看到将这些类添加到 ApplicationContext 中的任何明确方法,也没有看到任何这样做的示例。

是否有人设法以这种方式使用 SAF,以便在 UI 和 UI 操作代码之间实现清晰的分离?

【问题讨论】:

    标签: java design-patterns swing dependency-injection desktop-application


    【解决方案1】:

    我发现了一种使用@Actions 将 UI 与行为分开的好方法。

    首先,创建一个 UI 组件,比如一个带有按钮的 JPanel,然后给它一个公共方法,可以用来设置按钮的操作:

    class CustomJPanel extends JPanel {
       private JButton myButton;
       public CustomJPanel() {
          initializeComponents();
       }
       public void initializeComponents() {
          myButton = new JButton();
       }
       public void setButtonAction(javax.swing.Action action)
       {
          myButton.setAction(action);
       }
    }
    

    接下来,创建一个将为该按钮提供逻辑的 Action 类:

    class CustomJPanelActions {
       @Action
       public void doSomething()
       {
           JOptionPane.showMessageDialog(null,"You pressed me!");
       }
    }
    

    最后,设置应用程序控制器,并在设置过程中为相应的 UI 分配适当的操作:

    class MyApp extends SingleFrameApplication {
       private JFrame mainFrame;
       private JLabel label;
    
       @Override
       protected void startup() {
          getMainFrame().setTitle("BasicSingleFrameApp");
          CustomJPanel panel = new CustomJPanel();
          panel.setButtonAction(getContext().getActionMap(new CustomJPanelActions()).get("doSomething");
          show(panel);
       }
    
       public static void main(String[] args) {
          Application.launch(BasicFrameworkApp.class, args);
       }
    }
    

    这样,UI在逻辑上与控件(即Action)分离,可以自行测试。控制器可以做出它需要的任何决定,以确定要使用的操作集以及分配给 UI 控件的特定操作。也就是说,可以创建一个Test Action Set和一个Live Action Set等。

    这种使用 SAF 的方法对我来说效果很好。

    【讨论】:

      【解决方案2】:

      SAF javadoc 在ActionManager#getActionMap 的文档中有一些关于如何做这类事情的信息

      【讨论】:

        猜你喜欢
        • 2012-05-21
        • 2012-05-22
        • 2013-06-16
        • 1970-01-01
        • 2020-03-02
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多