Java 如何将@Action方法与Swing组件放在一个单独的类中?

Java 如何将@Action方法与Swing组件放在一个单独的类中?,java,design-patterns,swing,dependency-injection,desktop-application,Java,Design Patterns,Swing,Dependency Injection,Desktop Application,在开发Swing应用程序时,我通常为每个UI组件定义一个用于操作回调的委托接口。例如,如果有一个类MyDialog,它包含一个按钮MyButton,那么MyButton的ActionListener将调用MyDialog.Delegate.OnMyButtonClick(事件e)。然后UI组件变为“哑”,需要一个控制器来处理事件以及更新组件本身 我认为通过使用Swing应用程序框架的@Actions,我可以通过在实现类中定义@Action方法来绕过创建委托接口和实现,让ApplicationCo

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

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


有没有人能够以这种方式使用SAF,从而在UI和UI操作代码之间实现清晰的分离?

SAF javadoc在文档中提供了一些关于如何使用@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在逻辑上与控件(即操作)分离,并且可以自己进行测试。为了确定要使用的操作集以及要分配给UI控件的特定操作,控制器可以做出任何需要的决定。也就是说,可以创建测试动作集和实时动作集等

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