Java と Swing は、Listener や Action などの多くの小さなオブジェクトを奨励しています。決まり文句がたくさんありますが、それが Java のやり方です。戦うメリットは少ない。
匿名リスナーをインラインで作成するのはかなり簡単です。
JButton okButton = new JButton("OK");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ok();
}
});
ただし、同じアクションをメニューとボタンに割り当てるなど、アクションを再利用する必要があることがよくあります。これらをメイン アプリケーション ウィンドウに内部クラスとして配置できます。
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class MainWindow extends JFrame {
ZapAction zapAction;
public MainWindow() {
setSize(new Dimension(200,200));
zapAction = new ZapAction();
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Foo");
menu.add(new JMenuItem(zapAction));
menuBar.add(menu);
setJMenuBar(menuBar);
JButton zapButton = new JButton(zapAction);
add(zapButton);
}
public void zap() {
// do some zapping
System.out.println("Zap!");
// maybe we're all done zapping?
zapAction.setEnabled(isZappingPossible());
}
public boolean isZappingPossible() {
// determine if there's zapping to be done
return Math.random() < 0.9;
}
class ZapAction extends AbstractAction {
public ZapAction() {
super("Zap");
putValue(AbstractAction.SHORT_DESCRIPTION, "Zap something");
putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(
KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
putValue(AbstractAction.SMALL_ICON,
new ImageIcon(MainWindow.class.getResource("/icons/zap.png")));
setEnabled(true);
}
public void actionPerformed(ActionEvent e) {
zap();
}
}
}
public class Zap {
public static void main(String[] args) {
MainWindow mainWindow = new MainWindow();
mainWindow.setVisible(true);
}
}
ここでZapAction
は、package-private 可視性です。すべての UI コードを独自のパッケージに入れました (たとえばorg.myorg.myproject.ui
)。したがって、すべての UI オブジェクトがアクションにアクセスできます。
複雑な Swing アプリでは、UI ファサード レイヤーを作成するところまで行きました。これは、アクションと、それらをさまざまなコントロールに接続するすべてのコードのための適切な場所になります。また、外部コードが UI と対話するための便利な場所にもなり、UI コードがコア アプリケーション コードから分離されます。