【发布时间】:2011-10-02 00:14:13
【问题描述】:
我有一个JFrame 和一个CardLayout 设置为其布局管理器。这有两个JPanel 子类。一个是面板WordsLoadingPanel,它显示文本“Loading words...”并有一个JProgressBar。另一个必须实际加载单词。这需要一段时间(100 个单词大约需要 10-14 秒;这是一个非常有选择性的算法),所以我想向用户保证程序仍在运行。我使用firePropertyChange(String, int, int) 使面板中的加载算法触发了属性更改,WordsLoadingPanel 很好地捕捉到了更改 - 我知道这一点,因为我为此事件添加了一个侦听器来执行println,它可以工作.但是,当我将println 更改为实际更改JProgressBar 的值时,它什么也没做。我知道我正在正确更改值,因为如果我在算法开始之前设置值,它会起作用,并且它会在循环的最后一次迭代中起作用。我猜这是因为我的算法正在消耗计算能力,不会让JProgressBar 更新。
所以,我的问题是:如何让我的算法等待 Swing(这将是 AWT 调度线程吗?)在继续之前完成更新进度条?我试过了:
-
Thread.yield在循环的每次迭代中 -
Thread.sleep(1000L)在循环的每次迭代中,在 try/catch 中 - 将所有内容放入循环中
SwingUtilities.invokeLater(Runnable) - 仅将 CPU 密集型算法放入
SwingUtilities.invokeLater(Runnable)
编辑:为了进一步支持我对 CPU 消耗算法的假设(听起来像是儿童故事……),当我将 JProgressBar 设置为不确定时,它只会在算法完成后开始移动.
有人有什么建议吗?
谢谢!
【问题讨论】:
标签: java multithreading performance swing