【发布时间】:2011-10-07 21:23:48
【问题描述】:
我正在编写一个 JPanel,它在 flowlayout 中加载标签,其信息取自数据库表的列。不过我不认为这是相关的,因为加载数据不需要很长时间,只有“setVisible”需要一段时间来处理。
我看到的不幸结果是,正在加载的标签(比如说 100 个标签)看起来像是一次放置一个。虽然它确实在一秒钟内发生,但我更喜欢它先 ALL LOAD,然后立即穿上。
我一直认为,当你添加组件时,一切都已经完成,而 setVisible(true/false) 只是打开和关闭可见性。但是由于这个问题,我发现它可能不是这样工作的。
这是我的主要方法(如果需要,我可以提供更多代码):
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JFrame window = new JFrame();
window.setBounds(100, 100, 450, 300);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().setLayout(new BorderLayout());
JobInfoPanel jobInfoPanel = new JobInfoPanel();
window.getContentPane().add(jobInfoPanel,
BorderLayout.CENTER);
window.pack();
window.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
向我确认问题出在 setVisible 的事情是,如果我在 window.setVisible(true); 之后添加以下代码出现同样的问题:
jobInfoPanel.setPanelListVisible(false);
jobInfoPanel.setPanelListVisible(true);
我尝试了很多东西,但似乎没有任何效果,包括放置“jobInfoPanel.setPanelListVisible(false);”在 window.setVisible(true) 之前。同样的事情也会发生。
我认为我剩下的唯一解决方案是以某种方式在屏幕外绘制此面板,然后将其快速移动到正确的位置...如果这有任何意义(我在某些页面上已将其作为建议阅读,但这个特殊问题并不经常被提出)。
有没有更简单的方法来做我需要的事情?
非常感谢您的任何帮助,谢谢。
-阿萨夫
【问题讨论】:
-
出于好奇,您为什么要在 EventQueue 中运行它?为什么不在你的 main 方法中运行它?
-
我不是一个经验丰富的 java swing 程序员,无法回答这个问题......我之所以这样运行它是因为我从一些 swing 教程中复制/粘贴了它。
-
@Dave G,您是一名 15 年的 Java 开发人员,您问为什么要在
EDT上修改 Swing 组件? OP 在主要方法中所做的是正确的方法。 @Asaf,别担心,你做对了! -
@Moonbeam:你是对的,但不要太苛刻,这方面的指导多年来发生了变化。这是一篇声称可以的旧文章:java.sun.com/products/jfc/tsc/articles/threads/threads1.html.
-
我不确定您看到的响应时间是什么样的。如果我采用上面的代码,并将 100 个 JLabels 添加到 JobInfoPanel(使用流布局),我需要大约 150 毫秒来绘制窗口,而 setVisible() 调用大约需要 15 毫秒。我什至通过打开和关闭 jobInfoPanel 测试了你的情况,通常是
标签: java swing visibility