2

在我的表单中,当我按下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();
    }
}
}
4

1 回答 1

5

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

public T3() {

  //!! ..... etc...

  setVisible(true);
  getRootPane().setDefaultButton(okBtn);
}

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

于 2013-10-30T16:55:38.790 回答