我在从内部命令按钮以编程方式扩展组合框弹出时遇到了问题。
我的目标是一个接一个地展开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()但没有运气。
答案 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教程中的部分以获取更多信息。