我发现了一种使用@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 的方法对我来说效果很好。