【问题标题】:Programmatically clicking JButton if in focus如果焦点对准,以编程方式单击 JButton
【发布时间】:2015-03-08 08:02:20
【问题描述】:

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

}

【问题讨论】:

    标签: java swing


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多