我有一个JFrame
,其中CardLayout
设置为其布局管理器。这里有两个JPanel
的子类。一个是面板,WordsLoadingPanel
,它显示文本“加载单词...”,并有一个JProgressBar
。另一个必须实际加载单词。这需要一段时间(对于100个单词大约10-14秒;这是一个非常有选择性的算法),所以我想向用户保证程序仍在工作。我使面板中的加载算法触发了属性更改firePropertyChange(String, int, int)
,并且WordsLoadingPanel
正在捕获更改 - 我知道这是因为我添加了此事件的侦听器以执行println
,并且它可以工作。但是,当我将println
更改为实际更改JProgressBar
的值时,它什么也不做。我知道我正在改变这个值,因为如果我在算法启动之前设置了它的值,它将起作用,和它在循环的最后一次迭代中起作用。我猜这是因为我的算法正在消耗计算能力,不会让JProgressBar
更新。等待Swing在继续之前完成更新JProgressBar
所以,我的问题是:如何让我的算法等待Swing(这将是AWT调度线程?)在继续之前完成更新进度栏?我已经试过:
- 在循环
- 在每个循环迭代
Thread.sleep(1000L)
的每次迭代Thread.yield
,在一个try/catch - 把一切在循环中
SwingUtilities.invokeLater(Runnable)
- 只把CPU密集型算法在一个
SwingUtilities.invokeLater(Runnable)
编辑:为了进一步支持我的假设的CPU吃算法(听起来像一个孩子的故事...),当我将JProgressBar
设置为不确定时,只在算法完成后才开始移动。
有没有人有任何建议?
谢谢!
谢谢,我会研究这个! – wchargin
虽然我仍然对“SwingWorker”的工作原理感到困惑。我有一个'SwingWorker,Void>'带有'ArrayList doInBackground()'和一个'void process(List chunks)'。什么是“列表”的说法?何时调用“进程”?我似乎无法理解您从我提供的链接(文档)或维基百科。你能再解释一下吗?谢谢! –
wchargin
也请记住,这不是一个大的任务,这是一个小百的任务(约1/4秒每个)。 – wchargin