【问题标题】:how to paint jrame components before another process starts如何在另一个进程开始之前绘制 jrame 组件
【发布时间】:2013-02-15 14:40:49
【问题描述】:
private void addSomeComponentsToFrame(){
JFrame frame = new JFrame();
.....
frame.setVisible(true);

frame.getContentPane().validate();
frame.getContentPane().repaint();

runOtherTask();
}

我想在 runOtherTask 方法启动之前查看框架对象及其组件,但是当我尝试运行 addSomeComponentsToFrame 方法时,框架出现(作为黑色矩形)但会冻结,并且在 runOtherTask 方法完成后它会在屏幕上显示框架的组件。

【问题讨论】:

  • 您可以使用SwingUtilities.invokeLater来防止使用多个线程,这样可以确保绘制完成后执行runOtherTask()。但是,如果 runOtherTask() 是一个长时间运行的任务,最好在专用线程中执行并保持 EDT 响应。
  • @ExtremeCoders,我不明白在这里使用SwingUtilities 会有什么帮助。它要做的就是将runOtherTask 事件放在事件队列的末尾,这就是它的位置在这种情况下会不管。
  • @mre 我认为他的意思是仅在 EDT 上创建 Frame 并在 EDT 之外调用该方法,因此它将阻塞初始线程而不是 GUI EDT
  • 我找到了 JComponent.paintImmediately 方法,但我不明白。
  • JComponent.paintImmediately 不适用于 JFrame

标签: java multithreading swing jframe


【解决方案1】:

当我尝试运行 addSomeComponentsToFrame 方法时,会出现框架(如 黑色矩形)但冻结并在 runOtherTask 方法完成后 它在屏幕上显示框架的组件。

听起来您正在阻止 Event Dispatch Thread 执行长时间运行的任务。

您可能希望将该任务从 EDT 卸载到单独的线程

如果你在runOtherTask 中操作 Swing 组件更好用:

否则你可以使用(注意下面不会在 GUIs Event Dispatch Thread 中运行,因此不允许在其中操作 Swing 组件):

作为旁注不需要:

frame.getContentPane().validate();
frame.getContentPane().repaint();

简单地说:

frame.validate();
frame.repaint();

此外,如果您的 java 版本允许使用 revalidate() 而不是 validate()。但这些只有在从可见容器中添加/删除组件时才需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2011-02-25
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多