在输入字段中按Enter键时关闭自定义对话框

时间:2015-06-24 10:01:57

标签: java swing netbeans input dialog

我设计了一个带有两个单选按钮和一个数字微调器的小对话框(使用Netbeans中的GUI设计器)。

  1. 如果在焦点位于其中一个单选按钮上时按Enter键,则对话框会正确关闭,但如果焦点位于微调器上,则必须远离它才能使用Enter键。
    1. 如何指示Enter对话框真的意味着“接受并关闭”?
    2. 或者,如何指示(每个)输入字段将Enter中继到“接受并关闭”处理程序?
    3. 同样,即使焦点在微调器(或其他字段)上,如何指示Esc真正意味着“取消和关闭”的对话框?

2 个答案:

答案 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键自动变为能够关闭对话框。