同步jprogress条 公共类frame11扩展了javax.swing.JFrame实现了ActionListener, PropertyChangeListener{ 公共字符串[]columnNames={“路径”, “文件名”, “大小”}; 公共对象[][]数据; int-isJPEG(字符串s)引发IOException {int c=0;//不是jpeg 如果((s.endsWith(“.JPG”)| |(s.endsWith(.JPEG”))| |(s.endsWith(.JPEG”))| |(s.endsWith(.JPG))) { c=1;//是jpeg } 返回c; } } 私有void jButton1ActionPerformed(java.awt.event.ActionEvent evt){//GEN-FIRST:event_jButton1ActionPerformed setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_Cursor)); JFileChooser fch=新的JFileChooser(“C:\\”; jProgressBar1.setValue(0); jProgressBar1.SetStringPaint(真); jTextField1.setText(空); jTextField2.setText(空); jTextField4.setText(空); jLabel7.setText(空); 数据=新对象[15][3]; jTable2.setModel(新的DefaultTableModel(数据、列名)); setFileSelectionMode(仅限于JFileChooser.DIRECTORIES_); int ret=fch.showOpenDialog(null); int-apr=0; if(ret==JFileChooser.APPROVE\u选项) {apr=1; jTextField1.setText(fch.getSelectedFile().toString()); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_Cursor)); } else jTextField1.setText(“没有点击!!!”); 如果(apr==1){ jLabel7.setText(“请稍候,正在搜索…”); 任务=新任务(); task.addPropertyChangeListener(此); task.execute(); EventQueue.invokeLater(新的Runnable(){//已添加) @凌驾 公开募捐{ 文件f=fch.getSelectedFile(); 字符串s=f.getAbsolutePath(); int-cnt; int st=0; Path myfile=Path.get; if(f.isDirectory()&&Files.isReadable(myfile)){ 试一试{ st=st+检查文件(f); cnt=计数(f); 字符串ss=Integer.toString(cnt); jTextField2.setText(ss); jTextField4.setText(Integer.toString(st)); }捕获(IOEX异常){ Logger.getLogger(frame1.class.getName()).log(Level.SEVERE,null,ex); } } jLabel7.setText(“扫描完成,谢谢等待”); } }); } }//GEN-LAST:执行事件按钮1操作 私人任务; @凌驾 公共作废属性更改(属性更改事件evt){ if(“progress”.equals(evt.getPropertyName())){ int progress=(整数)evt.getNewValue(); jProgressBar1.设置值(进度); System.out.println(“财产变更”); } } //@凌驾 已执行的公共无效操作(操作事件e){ } 类任务扩展SwingWorker{ @凌驾 公共无效doInBackground(){ 随机=新随机(); int progress=0; setProgress(0); 而(进度

同步jprogress条 公共类frame11扩展了javax.swing.JFrame实现了ActionListener, PropertyChangeListener{ 公共字符串[]columnNames={“路径”, “文件名”, “大小”}; 公共对象[][]数据; int-isJPEG(字符串s)引发IOException {int c=0;//不是jpeg 如果((s.endsWith(“.JPG”)| |(s.endsWith(.JPEG”))| |(s.endsWith(.JPEG”))| |(s.endsWith(.JPG))) { c=1;//是jpeg } 返回c; } } 私有void jButton1ActionPerformed(java.awt.event.ActionEvent evt){//GEN-FIRST:event_jButton1ActionPerformed setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_Cursor)); JFileChooser fch=新的JFileChooser(“C:\\”; jProgressBar1.setValue(0); jProgressBar1.SetStringPaint(真); jTextField1.setText(空); jTextField2.setText(空); jTextField4.setText(空); jLabel7.setText(空); 数据=新对象[15][3]; jTable2.setModel(新的DefaultTableModel(数据、列名)); setFileSelectionMode(仅限于JFileChooser.DIRECTORIES_); int ret=fch.showOpenDialog(null); int-apr=0; if(ret==JFileChooser.APPROVE\u选项) {apr=1; jTextField1.setText(fch.getSelectedFile().toString()); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_Cursor)); } else jTextField1.setText(“没有点击!!!”); 如果(apr==1){ jLabel7.setText(“请稍候,正在搜索…”); 任务=新任务(); task.addPropertyChangeListener(此); task.execute(); EventQueue.invokeLater(新的Runnable(){//已添加) @凌驾 公开募捐{ 文件f=fch.getSelectedFile(); 字符串s=f.getAbsolutePath(); int-cnt; int st=0; Path myfile=Path.get; if(f.isDirectory()&&Files.isReadable(myfile)){ 试一试{ st=st+检查文件(f); cnt=计数(f); 字符串ss=Integer.toString(cnt); jTextField2.setText(ss); jTextField4.setText(Integer.toString(st)); }捕获(IOEX异常){ Logger.getLogger(frame1.class.getName()).log(Level.SEVERE,null,ex); } } jLabel7.setText(“扫描完成,谢谢等待”); } }); } }//GEN-LAST:执行事件按钮1操作 私人任务; @凌驾 公共作废属性更改(属性更改事件evt){ if(“progress”.equals(evt.getPropertyName())){ int progress=(整数)evt.getNewValue(); jProgressBar1.设置值(进度); System.out.println(“财产变更”); } } //@凌驾 已执行的公共无效操作(操作事件e){ } 类任务扩展SwingWorker{ @凌驾 公共无效doInBackground(){ 随机=新随机(); int progress=0; setProgress(0); 而(进度,java,swing,synchronization,swingworker,jprogressbar,Java,Swing,Synchronization,Swingworker,Jprogressbar,我想得到你的帮助,我正在尝试扫描我的电脑的JPEG图像,以计数他们。我有两个问题,第一个问题是我使用的是jtable,但是结果在程序结束之前是不会添加的,进度条也不会同步,有时在程序之前结束,有时在程序之后结束。请帮助我解决这两个问题,谢谢。您正在使用SwingWorker来创建后台线程--很好--但您直接从后台线程进行Swing调用--不好: 而是从SwingWorker内部调用setProgress(…),并向worker添加一个PropertyChangeListener,用于侦听work

我想得到你的帮助,我正在尝试扫描我的电脑的JPEG图像,以计数他们。我有两个问题,第一个问题是我使用的是jtable,但是结果在程序结束之前是不会添加的,进度条也不会同步,有时在程序之前结束,有时在程序之后结束。请帮助我解决这两个问题,谢谢。

您正在使用SwingWorker来创建后台线程--很好--但您直接从后台线程进行Swing调用--不好:

而是从SwingWorker内部调用
setProgress(…)
,并向worker添加一个PropertyChangeListener,用于侦听worker的“progress”绑定属性的更改

例如:


对于显示与SwingWorker一起使用JProgressBar示例的示例:

jProgressBar1.setValue(n);
导入java.awt.event.ActionEvent;
导入java.awt.event.KeyEvent;
导入java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入java.util.Random;
导入java.util.concurrent.ExecutionException;
导入javax.swing.*;
@抑制警告(“串行”)
公共类TestProgress2扩展了JPanel{
私有JProgressBar progressBar=新的JProgressBar(0,100);
私有操作startBackgroundTaskAction=新的startBackgroundTaskAction();
公共TestProgress2(){
progressBar.SetStringPaint(真);
添加(进度条);
添加(新JButton(startBackgroundTaskAction));
}
启用公共void setActionEnabled(启用布尔值){
startBackgroundTaskAction.setEnabled(已启用);
}
私有类StartBackgroundTaskAction扩展了AbstractAction{
公共StartBackgroundTaskAction(){
超级(“启动后台任务”);
putValue(助记符键,KeyEvent.VK_S);
}
@凌驾
已执行的公共无效操作(操作事件e){
progressBar.setString(空);
progressBar.setValue(0);
setActionEnabled(假);
MyTask MyTask=新建MyTask();
addPropertyChangeListener(新的MyTaskListener());
myTask.execute();
}
}
私有类MyTaskListener实现PropertyChangeListener{
@凌驾
公共作废属性更改(属性更改事件pcEvt){
MyTask MyTask=(MyTask)pcEvt.getSource();
if(“progress”.equals(pcEvt.getPropertyName())){
int progress=myTask.getProgress();
progressBar.setValue(进度);
}
if(pcEvt.getNewValue()==SwingWorker.StateValue.DONE){
setActionEnabled(真);
progressBar.setString(“完成”);
试一试{
myTask.get();
jProgressBar1.setValue(n);
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import javax.swing.*;

@SuppressWarnings("serial")
public class TestProgress2 extends JPanel {
   private JProgressBar progressBar = new JProgressBar(0, 100);
   private Action startBackgroundTaskAction = new StartBackgroundTaskAction();

   public TestProgress2() {
      progressBar.setStringPainted(true);
      add(progressBar);
      add(new JButton(startBackgroundTaskAction));
   }

   public void setActionEnabled(boolean enabled) {
      startBackgroundTaskAction.setEnabled(enabled);
   }

   private class StartBackgroundTaskAction extends AbstractAction {
      public StartBackgroundTaskAction() {
         super("Start Background Task");
         putValue(MNEMONIC_KEY, KeyEvent.VK_S);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         progressBar.setString(null);
         progressBar.setValue(0);
         setActionEnabled(false);
         MyTask myTask = new MyTask();
         myTask.addPropertyChangeListener(new MyTaskListener());
         myTask.execute();
      }
   }

   private class MyTaskListener implements PropertyChangeListener {
      @Override
      public void propertyChange(PropertyChangeEvent pcEvt) {
         MyTask myTask = (MyTask) pcEvt.getSource();
         if ("progress".equals(pcEvt.getPropertyName())) {
            int progress = myTask.getProgress();
            progressBar.setValue(progress);
         }
         if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) {
            setActionEnabled(true);
            progressBar.setString("Done");
            try {
               myTask.get();
            } catch (InterruptedException e) {
               e.printStackTrace();
            } catch (ExecutionException e) {
               e.printStackTrace();
            }
         }
      }
   }

   private class MyTask extends SwingWorker<Void, Void> {
      @Override
      protected Void doInBackground() throws Exception {
         Random random = new Random();
         int progress = 0;
         setProgress(0);
         while (progress < 100) {
             try {
                 Thread.sleep(random.nextInt(1000));
             } catch (InterruptedException ignore) {}
             progress += random.nextInt(10);
             setProgress(Math.min(progress, 100));
         }
         return null;
      }
   }

   private static void createAndShowGui() {
      TestProgress2 mainPanel = new TestProgress2();

      JFrame frame = new JFrame("TestProgress2");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}