tags:

views:

893

answers:

3

How can I set a cancel button in a Swing JDialog, i.e. a button whose action is performed automatically if the user presses the “Cancel” key on the keyboard?

The counterpart is offered for a default action via the setDefaultButton method of the dialog's root pane.

If that's helping, I'm searching for an analogue to the WinForms Form.CancelButton property.

+2  A: 

I don't think this is possible with JDialog without extending it.

You could use JOptionPane.showOptionDialog() (or possibly one of the other show methods), passing the JButtons you want to be used.

If the options passed are components, they'll be rendered as normal, so you can do something like this:

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]);
Rich Seller
Hi Rich, thanks for the example. Unfortunately, I need a completely customized dialog with lots of different controls, not merely an individualized option dialog. As far as I can see, there's no method/overload that can be passed a completely customized panel.
Konrad Rudolph
I think you're right, if you have a custom dialog, you will need to implement the handling yourself, you can however rip off the processing to do so from JOptionPane. FWIW in SWT you can define an arbitrary subclass of Dialog and call its open() method to display it
Rich Seller
+2  A: 

Single line solution

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

where t is any component(except JButton) like JTextField in the dialog.

Prabu
A: 

All you have to do is attach the action listener to the button and call dialog.setVisible(false) inside of it.

eugener
Just try... it actually works
eugener
You don't answer the question. It was about to dismiss a dialog with a keystroke, in general with the Escape key. At least that's how I read the question, which is a bit ambiguous on re-reading it.
PhiLho
Oops, thanks for pointing that out. The question should read “‘cancel’ key,” not “button”. I’ll fix that.
Konrad Rudolph