2009-08-16 19 views
7

Swing JDialogのキャンセルボタン、つまりユーザーがキーボードの「キャンセル」キーを押したときに自動的に実行されるボタンを設定するにはどうすればよいですか?JDialogキャンセルボタン

ダイアログボックスのルートウィンドウのsetDefaultButtonメソッドを使用して、対応するアクションがデフォルトアクションとして提供されます。

私がWinFormsのForm.CancelButtonプロパティのアナログを探しています。

+0

エスケープキーを意味すると思います。 – NateS

答えて

1

これを拡張せずにJDialogで実行することはできません。

JOptionPane.showOptionDialog()(または他のshowメソッドの1つ)を使用して、使用するJButtonを渡すことができます。

int optionType = JOptionPane.DEFAULT_OPTION; 
int messageType = JOptionPane.PLAIN_MESSAGE; // no standard icon 

JButton ok = new JButton("ok"); 
JButton cancel = new JButton("cancel"); 
//add any handlers to the buttons 
... 
//construct options 
Object[] selValues = { ok, cancel }; 

//show dialog as normal, selected index will be returned. 
int res = JOptionPane.showOptionDialog(null, "message", 
     "title", optionType, messageType, null, selValues, 
     selValues[0]); 
+0

こんにちは、リッチ、例のおかげで。残念ながら、個別化されたオプションダイアログだけでなく、さまざまなコントロールを備えた完全にカスタマイズされたダイアログが必要です。私が見るところでは、完全にカスタマイズされたパネルを渡すことができるメソッド/オーバーロードはありません。 –

+1

私はあなたが正しいと思います。カスタムダイアログがあれば、自分で処理を実装する必要がありますが、JOptionPaneから処理を取り除くことができます。 SWTのFWIWでは、Dialogの任意のサブクラスを定義し、それを表示するopen()メソッドを呼び出すことができます –

2

シングルラインソリューションtは任意のコンポーネント(ある

t.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
    .put(KeyStroke.getKeyStroke("ESCAPE"), btnCancel.getAction()); 

:あなたはこのような何かを行うことができますので

渡されたオプションは、コンポーネントである場合、それらは、通常のようにレンダリングされますダイアログ内のJTextFieldのようなJButtonを除く)。

+1

'put()'メソッドの第2引数はアクションマップのキーであり、 'アクション'ではありません。これは、 'btnCancel.getAction()!= null'と、' btnCancel.getAction() 'によって返された' Action'が 't'のアクションマップにキーとして登録されている場合、 't.getActionMap()。put(btnCancel.getAction()、btnCancel.getAction())'が既に呼び出されていた場合。 – Jesse

1

ボタンにアクションリスナーを添付して、dialog.setVisible(false)を呼び出してください。

+0

ちょうど試してみてください...実際に動作します –

+0

あなたは質問に答えません。キーストローク、一般的にはエスケープキーを使ってダイアログを閉じようとしていました。少なくともそれはどのように私が質問を読んでいるかです。それはそれを再読する際に少し曖昧です。 – PhiLho

+0

おっと、それを指摘してくれてありがとう。質問は "ボタン"ではなく "キャンセル"キーを読むべきです。私はそれを修正します。 –

3

私が見ることができる最も良い方法は、ルートペインのアクションマップにActionを追加し、ルートペインの入力マップを使用してそのアクションをエスケープキーにリンクすることです。

これには、Actionが必要です。 (。すなわちcancelButton.getAction() != null)あなたのキャンセルボタンの動作はアクションとして実装されている場合、これは動作します:

 
getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); 
getRootPane().getActionMap().put("CANCEL", cancelButton.getAction()); 

をそうでない場合は、キャンセルボタンのロジックがActionListener経由で実装されている場合、あなたはActionListeneractionPerformed()方法を持つことができますロジックを実装するprivate void onCancel()メソッドを呼び出し、同じメソッドを呼び出す「キャンセル」アクションを登録します。

 
getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL"); 
getRootPane().getActionMap().put("CANCEL", new AbstractAction(){ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     onCancel(); 
    } 
}); 
関連する問題