为什么java会摆动';要花这么长时间吗?
我正在编写一个JPanel,它在flowlayout中加载标签,其信息取自数据库表的列。不过,我不认为这有什么关系,因为加载数据并不需要很长时间,只有“setVisible”需要一段时间来处理 我看到的不幸结果是,加载的标签(比如说100个标签)看起来像是一次放置一个标签。虽然它确实会在一秒钟内发生,但我更希望它先加载,然后立即加载 我一直认为,当您添加组件时,一切都已经完成,setVisible(true/false)只是打开和关闭可见性。但由于这个问题,我发现也许这并不是它的工作原理 以下是我的主要方法(如果需要,我可以提供更多代码): 如果我在window.setVisible(true)之后添加以下代码,我就可以确认setVisible中存在的问题;同样的问题也出现了:为什么java会摆动';要花这么长时间吗?,java,swing,visibility,Java,Swing,Visibility,我正在编写一个JPanel,它在flowlayout中加载标签,其信息取自数据库表的列。不过,我不认为这有什么关系,因为加载数据并不需要很长时间,只有“setVisible”需要一段时间来处理 我看到的不幸结果是,加载的标签(比如说100个标签)看起来像是一次放置一个标签。虽然它确实会在一秒钟内发生,但我更希望它先加载,然后立即加载 我一直认为,当您添加组件时,一切都已经完成,setVisible(true/false)只是打开和关闭可见性。但由于这个问题,我发现也许这并不是它的工作原理 以下是
jobInfoPanel.setPanelListVisible(false);
jobInfoPanel.setPanelListVisible(true);
我尝试了很多方法,但似乎没有任何效果,包括将“jobInfoPanel.setPanelListVisible(false);”放在window.setVisible(true)之前。同样的事情也发生了
唯一的解决办法,我认为我留下的是不知怎么画这个面板离开屏幕,然后把它快速移动到正确的位置。。。如果这有什么意义的话(我在一些页面上读到这篇文章是作为一个建议,但这个问题并没有经常被提及)
有没有更简单的方法来满足我的需求
非常感谢您的帮助,谢谢
-阿萨夫
在信息为的flowlayout中加载标签的面板
取自数据库表的列
这是我的工作。你可以找到一个例子,通过这种方式,你可以减少绘制成吨的图像所需的时间。我感谢大家的回答,但是通过创建一个单独的方法来解决这个问题,该方法初始化了这个面板,并在主方法中的pack()之后调用它,如下所示:
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();
jobInfoPanel.createDriverListPanel();
window.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
我不能完全解释为什么会这样,但它确实做到了我想要它做的。这些标签不是一次只出现一个,而是立即弹出
再次感谢大家,,
-Asaf出于好奇,您为什么要在EventQueue中运行此功能?为什么不在主方法中运行它呢?我不是一个有经验的java swing程序员,不能回答这个问题。。。我这样运行它是因为我复制/粘贴了一些swing教程中的内容。@Dave G,你是一名15年的Java开发人员,你在问为什么要在
EDT
上修改swing组件?OP在主方法中所做的是正确的方法@阿萨夫,别担心,你做得对@月光:你是对的,但不要太苛刻,多年来对这方面的指导已经改变了。这里有一篇旧文章声称它是可以的:。我不确定你看到的是什么样的响应时间。如果我使用上面的代码,并将100个JLabel添加到JobInfoPanel(使用flow layout),则绘制窗口需要约150毫秒,而setVisible()调用大约需要15毫秒。我甚至用打开和关闭jobInfoPanel测试了您的案例,通常小于5ms。我认为您是对的,但不幸的是,我对这项工作非常陌生,因为是我的老板用Windows Builder Pro创建了组件的外观,所以我觉得现在更改它有点太尴尬了。@如果可能,请尽快将这项工作留给鲸鱼,没有什么真正学到的:-哈哈,也许当就业市场感觉好一点的时候,我会考虑的。这是我大学毕业后的第一份真正的工作。这不应该是一个玩笑:-)
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();
jobInfoPanel.createDriverListPanel();
window.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}