从内部JButton扩展JCombo框弹出

时间:2015-11-16 14:25:29

标签: java swing

我在从内部命令按钮以编程方式扩展组合框弹出时遇到了问题。

我的目标是一个接一个地展开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);
            }
        }
    }
}

完整的代码可以在这里找到: http://pastebin.com/pU52vZ9b

当我在'frame.setVisible(true);'之后调用drillDown()方法时,我能够成功扩展所有组合框。

但是当我尝试从嵌入式jButton启动它时(请查看附带的截图)。只有最后一个组合框才会扩展,尽管如此 虽然所有的Comboboxes和combo.requestFocusInWindow()每次都返回true,但它正在迭代。

我也尝试使用SwingUtilities.invokeLater()调用drillDown()但没有运气。

屏幕截图:http://i.stack.imgur.com/tukBl.png

1 个答案:

答案 0 :(得分:2)

  

但是当我尝试从嵌入式jButton

启动它时

从ActionListener调用的代码在Event Dispatch Thread上执行。该线程负责绘制GUI并保持GUI响应。

Thread.sleep(1000);

这导致EDT进入休眠状态,这意味着GUI不能重新绘制,直到所有代码都完成执行,因此您只能看到显示的最后一个组合框。

不要使用Thread.sleep();

阅读Concurrency上Swing教程中的部分以获取更多信息。一种解决方案是使用教程中描述的SwingWorker

另一种方法可能是使用Swing Timer。计时器将安排事件。因此,每次Timer触发时,您都会显示另一个组合框的下拉列表。

阅读How to Use Swing Timers上的Swing教程中的部分以获取更多信息。