为什么java swing的setVisible需要这么长时间?

时间:2011-07-18 17:37:47

标签: java swing visibility

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

我看到的不幸效果是加载的标签(比方说100个标签)看起来像是一次放置一个。虽然它确实在一秒钟内发生,但我更倾向于首先加载所有加载,然后立即加入。

我一直认为,当您添加组件时,一切都已完成,而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)之前。同样的事情发生了。

我认为我留下的唯一解决方案是以某种方式将此面板绘制在屏幕外,然后将其快速移动到正确的位置......如果这有任何意义(我在某些页面上将其视为建议,但这个特殊问题并没有经常提出来。)

有没有更简单的方法来做我需要的事情?

非常感谢任何和所有帮助,谢谢。

-Asaf

2 个答案:

答案 0 :(得分:2)

  

正在其信息所在的flowlayout中加载标签的面板   取自数据库表的列

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

答案 1 :(得分:0)

我感谢大家的回复,但能够通过制作一个单独的方法来解决这个问题,该方法初始化了这个面板并在主方法中调用它后面的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