7

如何在 Swing 中设置取消按钮JDialog,即如果用户按下键盘上的“取消”键,该按钮的操作会自动执行?

setDefaultButton通过对话框的根窗格的方法为默认操作提供对应项。

如果这有帮助,我正在寻找 WinFormsForm.CancelButton属性的类似物。

4

4 回答 4

4

我能看到的最好的方法是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,您可以让调用方法的actionPerformed()方法实现该逻辑,并注册一个调用相同方法的“取消”操作。ActionListenerprivate void onCancel()

getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "CANCEL");
getRootPane().getActionMap().put("CANCEL", new AbstractAction(){
    @覆盖
    公共无效actionPerformed(ActionEvent e)
    {
        onCancel();
    }
});
于 2012-03-05T15:29:26.917 回答
2

单线解决方案

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

其中 t 是对话框中的任何组件(JButton 除外),例如 JTextField。

于 2009-08-16T14:36:14.993 回答
1

我认为如果不扩展它,JDialog 是不可能的。

您可以使用 JOptionPane.showOptionDialog() (或者可能是其他显示方法之一),传递您想要使用的 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]);
于 2009-08-16T13:59:10.110 回答
1

您所要做的就是将动作侦听器附加到按钮并dialog.setVisible(false)在其中调用。

于 2009-08-16T17:50:51.587 回答