代码之家  ›  专栏  ›  技术社区  ›  Mike Caron

如何将@action方法与Swing组件放在单独的类中?

  •  2
  • Mike Caron  · 技术社区  · 16 年前

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

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

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

    2 回复  |  直到 15 年前
        1
  •  2
  •   Mike Caron    15 年前

    我发现了一种很好的方法,可以使用@actions将用户界面与行为分开。

    首先,创建一个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);
       }
    }
    

    接下来,创建一个操作类,为该按钮提供逻辑:

    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控件的特定操作,控制器可以做出任何需要的决定。也就是说,可以创建一个测试操作集和一个活动操作集等。

    这种使用SAF的方法对我来说相当有效。

        2
  •  1
  •   Geoff Reedy    16 年前

    SAF JavaDoc在Doc for中提供了一些关于如何执行此类操作的信息。 ActionManager#getActionMap

    推荐文章