keyBinding 中的焦点导航

Posted

技术标签:

【中文标题】keyBinding 中的焦点导航【英文标题】:Focus navigation in keyBinding 【发布时间】: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();
    


【问题讨论】:

【参考方案1】:

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

public T3() 

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

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

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

【讨论】:

非常非常好,谢谢:D!

以上是关于keyBinding 中的焦点导航的主要内容,如果未能解决你的问题,请参考以下文章

Wpf UserControl使用 KeyBinding,失效问题

比较 KeyListeners 和 Key Bindings 之间的功能

TextBox Binding TwoWay 直到焦点丢失 WP7 才会更新

单击焦点侧导航中的链接打开向下滚动的页面

画外音:每次加载视图时,ViewWillAppear 中的 UIAccessibilityLayoutChangedNotification 都没有将焦点设置在导航栏标题上

在选项卡和焦点轮廓未显示时跳过第一个导航锚