【问题标题】:How to preload Swing components如何预加载 Swing 组件
【发布时间】:2012-02-10 12:34:19
【问题描述】:

我知道这是一个模糊的问题,但我会尽量让它清楚。当我的 Java 应用程序第一次启动时,它会检查文件和目录是否存在并检查互联网连接。

然后,该应用程序允许用户移动到仪表板,这需要加载许多 Swing 组件并将其添加到背景面板。这需要时间。

我想知道如何做到这一点,以便在开始加载过程中,应用程序加载所有 Swing 组件图像等,以便在用户执行命令时立即显示。

我可以像这样加载所有组件:

JButton = new JButton("blah"); 

但我不确定这是否足以让组件立即出现,同时添加几个填充图像的 Swing 组件不会仍然滞后 UI 线程,即使它已经“加载”如上所示?

谢谢!

【问题讨论】:

    标签: java swing loading


    【解决方案1】:

    关于组件的使用

    setVisible(false)
    

    例如

    public class myParentPanel extends JPanel{
         public myParentPanel{
    
         //add all the child components
         //Do what ever takes along time
         setVisible(false); //this then makes in invisible but still 
                            //allows all the set up code to run
         }
    
         public void showParent(){
             setVisible(true);
             invalidate();
         }
    }
    

    然后创建一个方法让它们在需要时可见。因此,当您调用方法时,可以调用构造函数中的所有设置:

    drawWindow()
    

    然后它只需要调用 setVisible(true) 并使屏幕无效来调用他们的绘画方法:)。

    对此的改进是*运行您的设置,即在单独的线程上检查和加载面板方法*因此您不必等待顺序加载。因此,在您加载时,您可以使用匿名类

     SwingUtilities.invokeLater(new Runnable(){ public void run(){
    
         //do my display set up
    
    }});
    

    【讨论】:

    • 如果你打算使用单独的线程,那么不要忘记 Swing 组件不是线程安全的。您需要使用SwingUtilities.invokeLaterinvokeAndWait 来进行任何组件树更新。
    • 问题是,我已经在加载屏幕上有组件,所以现在我必须从中心窗格中删除组件并添加新组件,如果我为加载屏幕添加了组件以及仪表板的组件即使设置为不可见也不会弄乱可见的组件吗?
    • 好点卡梅伦为添加完全忘记的内容而欢呼:s。 Epic - 这取决于您在父容器中使用的布局类型。如果您使用的是默认布局,那么可以,但是请尝试使用绝对布局,这应该意味着组件空间应该留空,并且每个东西都放置在您想要的位置(如果您希望间距大小一致,您需要使位置相对于彼此)
    • 从技术上讲,您是正确的,因为没有 absoulteLayout 管理器,但我只是建议使用绝对布局,即 docs.oracle.com/javase/tutorial/uiswing/layout/none.html 因此没有布局管理器而不是默认的 flowLayout
    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多