草庐IT

来自 EDT 问题的 Java Swing 进度条

coder 2024-03-29 原文

这是为那里的挥杆专家准备的。我在这个问题上花了很多时间,所以我将花几行来解释这个问题。

我有一个独立的 java swing 应用程序 (java 6)。在我的应用程序中,我有一个带有单选按钮组的框架。我有一个链接到组中所有按钮的单一操作。该操作检查选择了哪个单选按钮并执行一些工作。 “工作”涉及一些背景计算以及我应用程序中其他两个框架中的一些绘画。后台计算是多线程的。

我想在用户选择其中一个单选按钮时显示一个进度条。 However, when a radio button is selected, while the action to the radio button is happening, the progress bar never appears.我已经尝试过 jdialog 类型的进度条、玻璃 Pane 等。在“工作”全部完成之前,它们都不会出现。这似乎是因为 Swing 直到相应 Action 中的“工作”完成后才完成绘制单选按钮。由于 EDT 一次只做一件事,因此永远不会显示进度条对话框(或玻璃 Pane )。

然后我尝试使用 SwingWorker 来完成所有这些“工作”。在 SwingWorker 的 done() 方法中启动进度条(或激活玻璃 Pane ),启动 SwingWorker 并关闭进度条(或停用玻璃 Pane )。这似乎可以很好地调出进度条,但是作为“工作”一部分的绘画有时没有完成,给我留下一些绘画工件(paintComponent 方法非常复杂,所以不想在这里重现)。如果我调整窗口大小,这些伪影就会消失。事实上,如果我也使用扩展 Thread 而不是 SwingWorker 的类,就会发生这种情况。这都是因为 Swing 不是线程安全的,我正在尝试从 EDT 以外的线程执行 GUI 工作。我明白那部分。

我该怎么办? “工作”大约需要 30 秒,如果不向用户显示程序正在运行的某种指示,这似乎太长了。我也曾尝试将光标更改为等待光标,但遇到了与上述相同的问题。我唯一能做的就是禁用框架并将框架的标题设置为一些文本,例如“正在工作...”

以前有人遇到过这个问题吗?

最佳答案

我认为您在 SwingWorker 线程中进行工作是正确的,但您不应该尝试在那里进行绘画。

我倾向于:

  • 让 ActionListener show() 进度条,触发 swingworker 然后退出

  • 让工作线程完成工作,并定期在进度条组件上调用 repaint()(保证线程安全)

  • 进度条有它自己的 paintComponent(它将在 EDT 上自动调用)。如有必要,这可以读取一些由工作线程更新的变量以测量进度

  • 当工作线程完成时,让它调用 invokeLater() 以在 EDT 上运行最终关闭函数,这将隐藏进度条并执行任何其他与 GUI 相关的清理/向用户等

关于来自 EDT 问题的 Java Swing 进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3472824/

有关来自 EDT 问题的 Java Swing 进度条的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  4. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  5. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  8. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  9. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  10. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

随机推荐