如果按钮处于焦点状态,如何通过编程点击JButton

4

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

}
1个回答

4

并不是所有的代码都是同步执行的。有些代码会被添加到事件分派线程(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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接