为什么java会摆动';要花这么长时间吗?

为什么java会摆动';要花这么长时间吗?,java,swing,visibility,Java,Swing,Visibility,我正在编写一个JPanel,它在flowlayout中加载标签,其信息取自数据库表的列。不过,我不认为这有什么关系,因为加载数据并不需要很长时间,只有“setVisible”需要一段时间来处理 我看到的不幸结果是,加载的标签(比如说100个标签)看起来像是一次放置一个标签。虽然它确实会在一秒钟内发生,但我更希望它先加载,然后立即加载 我一直认为,当您添加组件时,一切都已经完成,setVisible(true/false)只是打开和关闭可见性。但由于这个问题,我发现也许这并不是它的工作原理 以下是

我正在编写一个JPanel,它在flowlayout中加载标签,其信息取自数据库表的列。不过,我不认为这有什么关系,因为加载数据并不需要很长时间,只有“setVisible”需要一段时间来处理

我看到的不幸结果是,加载的标签(比如说100个标签)看起来像是一次放置一个标签。虽然它确实会在一秒钟内发生,但我更希望它先加载,然后立即加载

我一直认为,当您添加组件时,一切都已经完成,setVisible(true/false)只是打开和关闭可见性。但由于这个问题,我发现也许这并不是它的工作原理

以下是我的主要方法(如果需要,我可以提供更多代码):

如果我在window.setVisible(true)之后添加以下代码,我就可以确认setVisible中存在的问题;同样的问题也出现了:

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();
            }
        }
    });
}