【发布时间】:2010-11-20 00:54:41
【问题描述】:
如何在 Swing JDialog 中设置取消按钮,即如果用户按下键盘上的“取消”键,该按钮的操作会自动执行?
通过对话框根窗格的setDefaultButton 方法为默认操作提供对应项。
如果这有帮助,我正在寻找 WinForms Form.CancelButton 属性的类似物。
【问题讨论】:
如何在 Swing JDialog 中设置取消按钮,即如果用户按下键盘上的“取消”键,该按钮的操作会自动执行?
通过对话框根窗格的setDefaultButton 方法为默认操作提供对应项。
如果这有帮助,我正在寻找 WinForms Form.CancelButton 属性的类似物。
【问题讨论】:
如果不扩展 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]);
【讨论】:
单线解决方案
t.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
.put(KeyStroke.getKeyStroke("ESCAPE"), btnCancel.getAction());
其中 t 是对话框中的任何组件(JButton 除外),例如 JTextField。
【讨论】:
put() 方法的第二个参数是动作映射的键,而不是Action。这只有在btnCancel.getAction() != null 和btnCancel.getAction() 返回的Action 在t 的操作映射中注册且其自身作为键时才有效,即。如果之前调用过 t.getActionMap().put(btnCancel.getAction(), btnCancel.getAction())。
您所要做的就是将动作侦听器附加到按钮并在其中调用dialog.setVisible(false)。
【讨论】:
我能看到的最好方法是将Action 添加到根窗格的操作映射中,并使用根窗格的输入映射将该操作链接到转义键。
为此,您需要一个Action。如果您的取消按钮的行为被实现为一个动作(即cancelButton.getAction() != null),那么这将起作用:
否则,如果取消按钮的逻辑是通过ActionListener 实现的,您可以让ActionListener 的actionPerformed() 方法调用实现逻辑的private void onCancel() 方法,并注册一个“取消”操作调用相同的方法。
【讨论】: