2007年10月17日

Javaアプリケーションで、ESCキーを押したときにダイアログを閉じる

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キー押しちゃうし。

この記事へのコメント
SystemLAFにすればWindowsならばESCで自動的に閉じられませんか?
Posted by とおりすがり at 2007年10月21日

JOptionPaneを使って表示したダイアログはESCキーで閉じることができますが、JDialogを継承したものはWindowsのシステムL&Fにしても閉じられないのです。少なくともJRE1.6では無理のようです。
Posted by kazina at 2007年10月21日

コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。