Java swing 进度条的显示问题

问题描述

最近在做一个C/S的通行软件,其中涉及到文件传输的功能,希望能够显示文件的上传进度,但是遇到一些问题无法解决:当传输文件时,进度条必须不断更新,但是Swing好像是单线程的,而且对Swing界面的更改不能在其他线程中进行(如果有错请指教),结果我现在的问题就是文件传输的过程中进度条不能更新,而且整个界面被阻塞,导致对界面无法进行其他操作,只有文件传输完成后才突然显示100%,下面贴出部分代码:包含进度条的类:publicclassTransmitBarextendsJPanel{privateFilefile;privateJProgressBarprogressBar;publicTransmitBar(Filefile){this.file=file;progressBar=newJProgressBar(0,(int)file.length());progressBar.setStringPainted(true);progressBar.setValue(0);progressBar.setPreferredSize(newDimension(215,20));this.setLayout(null);progressBar.setBounds(0,0,215,15);this.add(progressBar);this.setPreferredSize(newDimension(215,15));}publicTransmitBargetObj(){returnthis;}publicvoidstart(){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){try{FileInputStreamfis=newFileInputStream(file);FileOutputStreamfos=newFileOutputStream("D:\"+file.getName());intdata;inti=0;while((data=fis.read())!=-1){fos.write(data);i++;progressBar.setValue(i);//getObj().repaint();//getObj().updateUI();}//Thread.interrupted();}catch(Exceptione){}}});}}主窗体中通过按钮激发文件选择,将选择的文件传入上面类的构造方法中,然后调用类的start()方法,现在文件可以传输,但是进度条无法更新:

解决方案

解决方案二:
使用SwingWorker。具体用法请google
解决方案三:
我一直这么用。Threadthread=newThread(newRunnable(){publicvoidrun(){for(intpos=0;pos<100;pos++){jProgressBar1.setValue(pos);}}});thread.start();

解决方案四:
还是不行,我把start()方法改成如下:publicvoidstart(){Threadthread=newThread(newRunnable(){publicvoidrun(){try{FileInputStreamfis=newFileInputStream(file);FileOutputStreamfos=newFileOutputStream("D:\"+file.getName());intdata;inti=0;while((data=fis.read())!=-1){fos.write(data);i++;progressBar.setValue(i);getObj().repaint();getObj().updateUI();}}catch(Exceptione){}}});thread.start();}结构出现异常(我使用了Substance来美化界面):org.jvnet.substance.api.UiThreadingViolationException:ComponentstatechangemustbedoneonEventDispatchThreadatorg.jvnet.substance.utils.SubstanceCoreUtilities.testComponentStateChangeThreadingViolation(SubstanceCoreUtilities.java:2386)atorg.jvnet.substance.SubstanceProgressBarUI$1.stateChanged(SubstanceProgressBarUI.java:156)atjavax.swing.DefaultBoundedRangeModel.fireStateChanged(UnknownSource)atjavax.swing.DefaultBoundedRangeModel.setRangeProperties(UnknownSource)atjavax.swing.DefaultBoundedRangeModel.setValue(UnknownSource)atjavax.swing.JProgressBar.setValue(UnknownSource)atclient.ui.file.TransmitBar$1.run(TransmitBar.java:85)atjava.lang.Thread.run(UnknownSource)错误就是progressBar.setValue(i);这一句,在网上看到这样一句话:Swing界面的更改不能在其他线程中进行,不知道是不是这个原因
解决方案五:
还是不行,我把start()方法改成如下:publicvoidstart(){Threadthread=newThread(newRunnable(){publicvoidrun(){try{FileInputStreamfis=newFileInputStream(file);FileOutputStreamfos=newFileOutputStream("D:\"+file.getName());intdata;inti=0;while((data=fis.read())!=-1){fos.write(data);i++;progressBar.setValue(i);getObj().repaint();getObj().updateUI();}}catch(Exceptione){}}});thread.start();}结构出现异常(我使用了Substance来美化界面):org.jvnet.substance.api.UiThreadingViolationException:ComponentstatechangemustbedoneonEventDispatchThreadatorg.jvnet.substance.utils.SubstanceCoreUtilities.testComponentStateChangeThreadingViolation(SubstanceCoreUtilities.java:2386)atorg.jvnet.substance.SubstanceProgressBarUI$1.stateChanged(SubstanceProgressBarUI.java:156)atjavax.swing.DefaultBoundedRangeModel.fireStateChanged(UnknownSource)atjavax.swing.DefaultBoundedRangeModel.setRangeProperties(UnknownSource)atjavax.swing.DefaultBoundedRangeModel.setValue(UnknownSource)atjavax.swing.JProgressBar.setValue(UnknownSource)atclient.ui.file.TransmitBar$1.run(TransmitBar.java:85)atjava.lang.Thread.run(UnknownSource)错误就是progressBar.setValue(i);这一句,在网上看到这样一句话:Swing界面的更改不能在其他线程中进行,不知道是不是这个原因
解决方案六:
哟,这个还真不知道了。帮你UP
解决方案七:
原来还用了substance啊,这个真的不好说了这个LookAndFeel还要用一个单独的线程来启动才行它用线程实现了一些减隐,渐变的特效,也用HighLighter实现了不少效果但是相对的,Swing本身的对UI进行改变的很多方法都会被Substance的效果所覆盖HighLighter也完全失效,也就是说,如果你用了Substance就要完全接受它的一切,除非你能自己修改它的核心代码我以前也试过这个LookAndFeel,但是我发现它把我很多自己优化界面的东西覆盖掉了,只能放弃
解决方案八:

解决方案九:
新手想看看
解决方案十:
还是用swingworker比较好,很不错
解决方案十一:
你把更新界面的代码放在SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){processBar.setValue(i);}});不要把IO相关的操作放到界面更新队列里面去
解决方案十二:
引用7楼huntor的回复:

14.32.14.SwingWorkerandProgressBar

顶这个。将上传的逻辑处理放在doInBackground方法中,在publish方法中可以更新你的JProgressBar组件,详见API中的SwingWoker说明。
解决方案十三:
帮定,祝你好运
解决方案十四:
除了SwingWorker,其他Thread实现都是不安全的
解决方案十五:
本人新手学习学习!
解决方案:
这个可以算的。。。。但swing也可以多线程啊!!
解决方案:
引用15楼asliuyajun的回复:

这个可以算的。。。。但swing也可以多线程啊!!

Swing的多线程和其他服务器程序的多线程还是有些差别的,Swing在考虑多线程的同时还要注意界面变化和更新,这些都是要在EDT线程中去实现的。

时间: 2024-10-26 08:11:53

Java swing 进度条的显示问题的相关文章

java 使用进度条progressbar显示更新的问题,不能同步

问题描述 听说要想在一个frame上面,在点了一按钮的同时用progressbar进度条来显示操作的进度,得用个多线程处理.我也不要求这进度条显示多少百分比,就只要在那方法进行的时候来回摆动就行了.任务完成的时候就显示结束.privateJButtonButton=null;privateJPanelgetPane(){if(Cpane==null){pbar=newJProgressBar();pbar.setBounds(880,20,200,34);pbar.setStringPainte

java Swing 进度条 多线程问题 附代码

问题描述 目标:当我点击主界面上的开始按钮,然后就会用大约1分钟来进行数据处理.但是在数据处理的时候,整个软件就像死了一样(其实没有),刷新还在继续,所以我想达到这样的效果:点击开始按钮,就弹出一个进度条在不停的动,表示程序正在运行,并没有死,然后进度条在持续更新,从1%到100%,当数据处理结束时,进度条消失,显示主界面,怎么实现呀!望大家处处注意!谢谢!问题:程序无法实现[处理中]对话框进度条与数据处理同步开始的功能.如何使他们同步进行?即:数据处理一开始,就让进度条对话框弹出,且从0%开始

关于java进度条的显示问题

问题描述 关于java进度条的显示问题 我的进度条老是显示到36%然后就变成0%了,然后过一段时间又从0开始 我将进度条显示的值打印出来之后发现每次从0增加到36之后会变成-36 然后继续增加,这是怎么回事 解决方案 设置断点跟踪一下,看是不是进度计算出了问题: 解决方案二: 将设置到进度条的数值通过 log 打印出来,这个问题应该是设置的数值出了问题! 解决方案三: 进度条数值计算出问题了.

swing 进度条

1,进度条实例     2,创建一个进度条 Java代码   copyProgressBar = new JProgressBar();           copyProgressBar.setBorderPainted(true);           copyProgressBar.setString(PROGRESSINITSTR);           copyProgressBar.setStringPainted(true);       3,进度条两种模式 模式一:百分比模式(d

android用的handler更新进度条但是显示不出来并且进度条的高不能改总是那么高

问题描述 android用的handler更新进度条但是显示不出来并且进度条的高不能改总是那么高 xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layo

java swing组件拖动和显示问题

问题描述 java swing组件拖动和显示问题 两个问题(1)做出来的窗体组件运行后点击"添加"按钮,应该再窗体上生成一个JLabel标签,点击后能够生成但显示不出来,改变窗体大小才能显示出来.(2)生成的JLabel能够改变大小和拖动,先拖动到另一个位置,改变窗体大小后,又回到原来的位置去了.求大神知道下. 看了以前的帖子@raistlic说是重绘问题,但是按帖子方法把setVisible放在添加控件后面不起作用.使用getContentPane()invalidate.()总是提

怎么样在进度条中显示processbar的value值

问题描述 怎么样在进度条中显示processbar的value值 怎么样在进度条中显示processbar的value值?怎么制作中间带有数字百分比的进度条控件? 解决方案 这里有个现成的参考下:http://download.csdn.net/detail/zmwhao88/4615459 解决方案二: 自己绘制,不过一般的语言都会提供带百分比的进度条,可能样式不是你想要的,要个性化,就自己继承一个,自己绘制样式 解决方案三: 关于DataGrid中的进度条的显示

swift 环形进度条,显示不出来

问题描述 swift 环形进度条,显示不出来 func onClickConfirm() { ///check if ipusernamepassname is correct println(m_ServerAddress.text) //eares the space before and after // let REMOTE_SYNC_SERVER_URL: String = ""http:/"" + m_ServerAddress.text + "

process-C# winform 执行主程序 页面假死 假死,进度条无法显示

问题描述 C# winform 执行主程序 页面假死 假死,进度条无法显示 现有一个程序,winform.在主页面中有一个button,button触发调用外部一个bat file bat file执行完会将结果反馈到主页面的UI上.我希望在bat 运行期间,有一个进度条显示. 但是由于我button中调用的bat file是用process 调用的.所以UI假死,导致进度条无法加载. Process process = new Process(); process.StartInfo.Wind