gpt4 book ai didi

java - 等待 Swing 完成更新 JProgressBar,然后再继续

转载 作者:行者123 更新时间:2023-12-02 03:38:39 24 4
gpt4 key购买 nike

我有一个 JFrame,其中 CardLayout 设置为其布局管理器。其中有两个 JPanel 子类。其中一个是面板 WordsLoadingPanel,它显示文本“正在加载单词...”并具有一个 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 消耗算法的假设(听起来像一个 child 故事......),当我将 JProgressBar 设置为不确定时,它仅在之后开始移动 算法完成。

有人有什么建议吗?

谢谢!

最佳答案

要在后台执行昂贵的操作,请考虑使用 SwingWorker 类(class)。该文档提供了有关如何使用它在单独的线程中执行与用户界面交互的任务的示例,包括JProgressBar中的进度显示。 s。

如果您无法理解该类的工作原理,请考虑:

  • SwingWorker是一个带有两个参数的泛型类:T ,和V
  • doInBackground方法返回 T并在单独的线程中执行。
  • 由于 Swing 只能在事件调度线程中操作,因此您不能在 doInBackground 中操作 Swing .
  • process方法需要 List<V>作为参数并在事件调度线程上异步调用。
  • publish方法需要 V...参数并将它们发送到 process 中进行处理方法。

结论:

  • T是计算结果的类型(如果有)。
  • V是操作用户界面所需的数据类型。
  • 您的算法应完全在 doInBackground 中运行.
  • 用户界面应在process中进行操作。方法。
  • 您的算法应使用 publish将数据发送到process方法。

关于java - 等待 Swing 完成更新 JProgressBar,然后再继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7623798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com