我设计了一个带有两个单选按钮和一个数字微调器的小对话框(使用Netbeans中的GUI设计器)。
答案 0 :(得分:1)
如何指示(每个)输入字段将Enter中继到“接受并关闭”处理程序?
最简单的方法是在对话框中定义“默认按钮”。然后按Enter键时,将激活默认按钮。请查看Enter键和按钮,了解不同的方法。
如何指示Esc真正意味着“取消并关闭”
的对话框
使用Key Bindings
调用“取消”按钮的操作。
首先定义按钮使用的Action
:
public class CancelAction extends AbstractAction
{
public CancelAction()
{
super("Cancel");
putValue( Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_C) );
}
@Override
public void actionPerformed(ActionEvent e)
{
Window window = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
if (window != null)
{
WindowEvent windowClosing = new WindowEvent(window, WindowEvent.WINDOW_CLOSING);
window.dispatchEvent(windowClosing);
}
}
}
然后将Action
添加到按钮,以便用户可以使用鼠标:
CancelAction cancelAction = new CancelAction();
cancelButton.setAction( cancelAction );
dialog.add(cancelButton);
现在您可以使用键绑定将Escape键绑定到CancelAction,以便用户可以使用键盘:
KeyStroke escapeKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false);
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escapeKeyStroke, "ESCAPE");
getRootPane().getActionMap().put("ESCAPE", cancelAction);
答案 1 :(得分:0)
我怀疑我遇到问题的原因是一个微调器实际上是一个复合控件,而文本(井号,数字)字段是其中的一个组成部分。所以我需要将事件连接到该子组件,而不是连接到微调器本身:
// Make Ok/Cancel work when JSpinner has focus
getSpinnerField(jSpinnerOffset).addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
doOk();
}
});
其中" getSpinnerField()"只是私人方法的简写:
private JFormattedTextField getSpinnerField(JSpinner spinner) {
return ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField();
}
这样做,Esc键自动变为能够关闭对话框。