【问题标题】:synchronize the jprogress bar同步 jprogress 栏
【发布时间】:2015-04-23 18:25:32
【问题描述】:
   public class frame11 extends javax.swing.JFrame implements ActionListener,
    PropertyChangeListener {


 public String[] columnNames = { "Path",
                    "File Name",
                    "Size"};
       public  Object[][] data ;
int isJPEG (String s) throws IOException
   { int c=0;//not jpeg

    if ( (s.endsWith(".JPG")) || (s.endsWith(".JPEG"))||(s.endsWith(".jpeg"))||(s.endsWith(".jpg")))
{

                c=1;//is jpeg

}
   return c;
   }

           }


    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)     {//GEN-FIRST:event_jButton1ActionPerformed

    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    JFileChooser fch = new JFileChooser("C:\\");
   jProgressBar1.setValue(0);
    jProgressBar1.setStringPainted(true);
    jTextField1.setText(null);
    jTextField2.setText(null);
    jTextField4.setText(null);
    jLabel7.setText(null);
    data = new Object[15][3]; 
    jTable2.setModel(new DefaultTableModel(data, columnNames));
    fch.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    int ret = fch.showOpenDialog(null);
    int apr=0;
    if (ret==JFileChooser.APPROVE_OPTION)
    {     apr=1;
        jTextField1.setText(fch.getSelectedFile().toString());
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    }
    else jTextField1.setText("Nothing clicked!!!");
    if (apr==1)   {
    jLabel7.setText("Wait Please, While searching ...");
    task = new Task();
    task.addPropertyChangeListener(this);
    task.execute();
    EventQueue.invokeLater(new Runnable() { // Added

            @Override
            public void run() {
                File f = fch.getSelectedFile();
        String s= f.getAbsolutePath();
        int cnt;
        int st=0;
        Path myfile = Paths.get(s);
        if(f.isDirectory()&& Files.isReadable(myfile)){
        try {
        st=st+CheckFiles(f);
        cnt=count(f);
        String ss=Integer.toString(cnt);
        jTextField2.setText(ss);
        jTextField4.setText(Integer.toString(st)); 
        } catch (IOException ex) {
        Logger.getLogger(frame1.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
       jLabel7.setText("Scanning Finished. Thanks for waiting ");
    }

            });

    }

}//GEN-LAST:event_jButton1ActionPerformed
private Task task; 
@Override
public void propertyChange(PropertyChangeEvent evt) {
    if ("progress".equals(evt.getPropertyName())) {
        int progress = (Integer) evt.getNewValue();
        jProgressBar1.setValue(progress);
     System.out.println("Property changed");
    } 
}

//@Override
public void actionPerformed(ActionEvent e) {

}

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

    /*
     * Executed in event dispatching thread
     */
    @Override
    public void done() {
        Toolkit.getDefaultToolkit().beep();
        setCursor(null); 
    }
}

我需要您的帮助,我正在尝试扫描我的电脑以获取 JPEG 图像以计算它们。我有两个问题,第一个是我使用的是jtable,但是直到程序结束才添加结果,并且进度条有时不同步,有时在程序之前结束,有时在程序结束后结束。请帮我解决这两个问题,谢谢。

【问题讨论】:

    标签: java swing synchronization swingworker jprogressbar


    【解决方案1】:

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

    jProgressBar1.setValue(n);
    

    改为从 SwingWorker 中调用 setProgress(...),并向工作人员添加一个 PropertyChangeListener,以侦听工作人员的“进度”绑定属性的更改。

    例如:


    mcve 的示例显示了 JProgressBar 与 SwingWorker 的使用示例:

    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();
             }
          });
       }
    }
    

    【讨论】:

    • 这是我第一次使用jprogress bar,请您给我更多细节或建议我一个好的教程。非常感谢。
    • @sosono:请在我的答案编辑中查看我的代码示例的链接。我认为 JProgressBar 教程也有一个例子。
    • 我仍然有同样的问题,我将更新代码,请告诉我我做错了什么。谢谢。
    • @sosono:请创建并发布一个小而简单的完整程序来说明您的问题,MCVE。请查看链接了解这个非常有用的工具的详细信息。
    • 请查看我之前的帖子,除了计算目录中 jpeg 文件数量的函数 checkfiles 之外,我编写了所有内容
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多