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 都没有将焦点设置在导航栏标题上