我正在尝试以编程方式单击一个JButton,这很好,doClick()方法完美地工作。问题是我希望能够以编程方式单击当前关注的任何按钮。
我可以通过编程方式使用.grabFocus()给出一个按钮焦点(至少它看起来如此)但是由于某种原因.isFocusOwner()总是返回false。
如果代码运行,您可以直观地确认按钮'b2'确实处于焦点,但是if(frame.getFocusOwner()instanceof JButton)和if(b2.isFocusOwner)都返回false。
下面的代码说明了我遇到的问题。
我想我已经错过了一些明显的东西,但任何建议都会很棒。
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton b1 = new JButton("b1");
JButton b2 = new JButton("b2");
JTextField j1 = new JTextField(10);
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Push the button...");
}
});
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("...and let it go...");
}
});
panel.add(b1);
panel.add(b2);
panel.add(j1);
frame.add(panel);
frame.setSize(400, 400);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setVisible(true);
//// The two problems are below
// It looks like this does give 'b2' the focus, at least as far as the generated GUI is concerned
b2.grabFocus();
// First - Always returns false
if(frame.getFocusOwner() instanceof JButton) {
JButton focusedButton = (JButton) frame.getFocusOwner();
focusedButton.doClick();
System.out.println("In focus?");
}
else {
System.out.println("Apparently not");
}
// Second - Also always returns false
if(b2.isFocusOwner()) {
System.out.println("In focus...");
}
else {
System.out.println("Not in focus");
}
}
答案 0 :(得分:4)
并非所有代码都是同步执行的。有些代码会添加到Event Dispatch Thread (EDT)
的末尾。似乎焦点请求就是这种情况。因此,当执行if语句时,焦点尚未放在组件上。
解决方案是使用SwingUtilties.invokeLater()
包装代码,以便将代码添加到EDT的末尾,以便在组件获得焦点后执行:
//b2.grabFocus();
b2.requestFocusInWindow();
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
// First - Always returns false
if(frame.getFocusOwner() instanceof JButton) {
JButton focusedButton = (JButton) frame.getFocusOwner();
focusedButton.doClick();
System.out.println("In focus?");
}
else {
System.out.println("Apparently not");
}
// Second - Also always returns false
if(b2.isFocusOwner()) {
System.out.println("In focus...");
}
else {
System.out.println("Not in focus");
}
}
});
另外,不要使用grabFocus(),你应该使用requestFocusInWindow()
。阅读API以获取更多信息。