【问题标题】:Focus navigation in keyBindingkeyBinding 中的焦点导航
【发布时间】:2013-10-30 16:42:55
【问题描述】:

在我的表单中,当我按下键盘上的ENTER 按钮时,应该调用okAction() 方法(并且完美调用)。

我的问题是处于焦点状态,当我填充文本字段然后按下ENTER 按钮时,okAction() 没有被调用,因为焦点在第二个文本字段上(而不是在面板上)。

如何解决这个问题?

public class T3 extends JFrame implements ActionListener {

JButton cancelBtn, okBtn;
JLabel fNameLbl, lNameLbl, tempBtn;
JTextField fNameTf, lNameTf;

public T3() {
    add(createForm(), BorderLayout.NORTH);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 500);
    setVisible(true);
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new T3();
        }
    });
}

public JPanel createForm() {
    JPanel panel = new JPanel();
    panel.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "Button");
    panel.getActionMap().put("Button", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            okAction();
        }
    });

    okBtn = new JButton("Ok");
    okBtn.addActionListener(this);
    cancelBtn = new JButton("Cancel");
    tempBtn = new JLabel();
    fNameLbl = new JLabel("First Name");
    lNameLbl = new JLabel("Last Name");
    fNameTf = new JTextField(10);
    fNameTf.setName("FnTF");
    lNameTf = new JTextField(10);
    lNameTf.setName("LnTF");

    panel.add(fNameLbl);
    panel.add(fNameTf);
    panel.add(lNameLbl);
    panel.add(lNameTf);
    panel.add(okBtn);
    panel.add(cancelBtn);
    panel.add(tempBtn);

    panel.setLayout(new SpringLayout());
    SpringUtilities.makeCompactGrid(panel, 3, 2, 50, 10, 80, 60);
    return panel;
}

private void okAction() {
    if (fNameTf.getText().trim().length() != 0 && lNameTf.getText().trim().length() != 0) {
        System.out.println("Data saved");
    } else System.out.println("invalid data");
}

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == okBtn) {
        okAction();
    }
}
}

【问题讨论】:

    标签: java swing key-bindings focusmanager


    【解决方案1】:

    为您的 GUI 的 JRootPane 声明一个默认按钮:

    public T3() {
    
      //!! ..... etc...
    
      setVisible(true);
      getRootPane().setDefaultButton(okBtn);
    }
    

    实际上,使用默认按钮集,我认为您不需要使用键绑定。

    【讨论】:

    • 非常非常好,谢谢:D!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多