【问题标题】:Why does java swing's setVisible take so long?为什么 java swing 的 setVisible 需要这么长时间?
【发布时间】: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


【解决方案1】:

在其信息为的流布局中加载标签的面板 取自数据库表的列

这是JTable 的工作。您可以找到示例here,这样可以减少绘制大量JLabels 所需的时间。

【讨论】:

  • 我认为你是对的,但不幸的是我对这份工作很陌生,而且由于是我的老板使用 Windows Builder Pro 构建了组件的外观,所以我觉得有点不好意思改变现在就可以了。
  • @Asaf 如果可能的话,把这些工作留给鲸鱼吧,真的没有学到什么:-)
  • 哈哈,或许等就业市场好转一些的时候我会考虑。这是我大学毕业后的第一份真正的工作。
  • 这不应该是个玩笑:-)
【解决方案2】:

感谢大家的回复,但能够通过创建一个单独的方法来初始化此面板并在主方法中调用它 AFTER 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();
            }
        }
    });
}

我无法完全解释为什么会这样,但它确实做到了我想要它做的事情。而不是看到标签一次出现一个,它们都立即弹出。

再次感谢您, -阿萨夫

【讨论】:

    猜你喜欢
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2011-12-07
    相关资源
    最近更新 更多