Java 从内部JButton展开JCombo框弹出

Java 从内部JButton展开JCombo框弹出,java,swing,Java,Swing,我在从内部命令按钮以编程方式展开组合框弹出窗口时遇到了一个问题 我的目标是一个接一个地展开UI上可见的所有组合框,并收集每个组合框的屏幕截图 以下是我尝试的示例代码: void drillDown(Component component) throws InterruptedException{ if(component instanceof JComboBox){ JComboBox combo = (JComboBox) component; comb

我在从内部命令按钮以编程方式展开组合框弹出窗口时遇到了一个问题

我的目标是一个接一个地展开UI上可见的所有组合框,并收集每个组合框的屏幕截图

以下是我尝试的示例代码:

void drillDown(Component component) throws InterruptedException{
    if(component instanceof JComboBox){
        JComboBox combo = (JComboBox) component;
        combo.requestFocusInWindow();
        combo.getUI().setPopupVisible(combo, true);

        Thread.sleep(1000);
    }
    else if(component instanceof Container){
        if(((Container) component).getComponents().length>0){
            for(Component component2 : ((Container) component).getComponents() ){
                drillDown(component2);
            }
        }
    }
}
完整代码可在此处找到:

在“frame.setVisible(true);”之后调用drillDown()方法时,我能够成功地展开所有组合框

但是当我尝试从嵌入式jButton启动相同的按钮时(请找到附带的屏幕截图)。不过,只有最后一个组合框正在扩展 它正在迭代所有的组合框,combo.requestFocusInWindow()每次都返回true

我还尝试使用SwingUtilities.invokeLater()调用drillDown(),但没有成功

截图:

但是当我尝试从嵌入式jButton启动相同的命令时

从ActionListener调用的代码在事件调度线程上执行。此线程负责绘制GUI并保持GUI响应

Thread.sleep(1000);
这会导致EDT休眠,这意味着GUI在所有代码执行完毕之前无法重新绘制自身,因此您只能看到显示的最后一个组合框

不要使用Thread.sleep()

有关更多信息,请阅读上的Swing教程部分。一种解决方案是使用
SwingWorker
,如本教程所述

另一种方法是使用摆动计时器。计时器将安排事件。因此,每当计时器启动时,您都会显示不同组合框的下拉列表


有关更多信息,请阅读Swing教程中的部分。

您可能希望了解
Robot
Robot对我来说不是一个选择,因为UI是动态的,字段根据配置而变化。非常感谢您的回复。我会试着把结果发回来。SwingWorker为我工作!!。这就是我尝试过的。我在doInBackground()中遍历JPanel树,并在process()方法中执行requestFocusInWindow、setPopupVisible。我也试过使用,但还是一样的问题。