Я нашел хороший способ отделить пользовательский интерфейс от поведения с помощью @ Actions.
Сначала создайте компонент пользовательского интерфейса, скажем 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!");
}
}
Наконец, настройте контроллер приложения и во время настройки назначьте соответствующее действие соответствующему пользовательскому интерфейсу:
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);
}
}
Таким образом, пользовательский интерфейс логически отделен от элемента управления (т. Е. Действия) и может быть протестирован сам по себе. Контроллер может принимать любые необходимые ему решения, чтобы определить, какое действие установить и какое конкретное действие назначить элементам управления пользовательского интерфейса. То есть можно создать набор тестовых действий и набор активных действий и т. Д.
Этот метод использования SAF работал довольно хорошо для меня.