NetBeansを使ってみてからというもの、これまでDelphiで作ってたやつ全部Javaに移植したいぐらいの勢いでJava大好きになってしまいました。ポトリペタが可能なGUIのエディタはDelphi6のそれなんかより圧倒的に使いやすく(最近のDelphiは知りませんが)、もはやどうしてもWin32APIを使わなければならない場合を除いてDelphiを使う理由がありません。
しかしながらやはりJava、Windowsネイティブのアプリケーションと比べると操作や見た目で差違が出てしまい、使う時に違和感があります。ファイルダイアログなんかは似てはいるものの、Windowsのシェルメニュー等が使えずかなり不便です。
ダイアログもそうで、Windowsでは標準の動作としてESCキーでダイアログが閉じます。設定をキャンセルする時などよく使うのですが、SwingのJDialogではそうはなりません。ですがありがたいことにこれはごくわずかなコードで可能になります。
InputMap imap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "escape");
getRootPane().getActionMap().put("escape", new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e) {
dispose();
}
});
JDialogのインプットマップにESCキーを追加し、そのアクションに閉じる処理を追加します。このコードではdispose()ですが、破棄する必要がなければsetVisible(false)でもなんでもいいと思います。大事なのはgetInputMap()のWHEN_IN_FOCUSED_WINDOWで、これを指定することでウィンドウ内のどのコンポーネントにフォーカスがあろうが、ESCキーが有効になります。Windowsのネイティブの動作と同じです。
ちなみに、ダイアログがESCキーで閉じるのはWindows固有の動作のようなので、こうやって無理に対応させるよりはあえて非対応にしておく方がマルチプラットフォーム対応と言えるのかもしれません。でもやっぱ閉じる時はESCキー押しちゃうし。