gpt4 book ai didi

java - 如果获得焦点,以编程方式单击 JButton

转载 作者:搜寻专家 更新时间:2023-11-01 02:43:13 25 4
gpt4 key购买 nike

我正在尝试以编程方式单击 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");
}

}

最佳答案

并非所有代码都同步执行。一些代码被添加到 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 了解更多信息。

关于java - 如果获得焦点,以编程方式单击 JButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28921246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com