2015-08-18 38 views
0

有一些类似的问题 (Progress Bar Java)和(Java uploading percentage progressbar thread)的例子,但不明白如何使它适用于我的代码。Java Swing ProgressBar更新,同时计算

我的主要有2个板了另一种(其中一个是2个标签卡的TabbedPane)

public class MainIRH { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 
       MainWindow window = new MainWindow(); 
       JPanel mainPanel = new JPanel(new BorderLayout(0, 20)); 
       mainPanel.setBorder(new EmptyBorder(20, 20, 20, 20)); 

       JTabbedPane tabbedPane = new JTabbedPane(); 
       tabbedPane.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 

       ControlPanel controlPanel = new ControlPanel(); 

       tabbedPane.setBorder(new EmptyBorder(10, 10, 10, 10)); 
       controlPanel.setBorder(new EmptyBorder(0, 20, 20, 20)); 

       ECPanel ecPanel = new ECPanel(); 
       SMRPanel smrPanel = new SMRPanel(); 

       tabbedPane.addTab("Environnement Canada", null, ecPanel, "Convertir des données des stations d\'Environnement Canada"); 
       tabbedPane.addTab("Station Météo Routière", null, smrPanel, "Convertir des données des stations météos routières"); 

       mainPanel.add(tabbedPane, BorderLayout.NORTH); 
       mainPanel.add(controlPanel, BorderLayout.CENTER); 
       window.add(mainPanel); 

       new ControllerIRH(ecPanel, smrPanel, controlPanel); 

       window.setVisible(true); 
      } 
     }); 
    } 
} 

最重要的一点是这个对象:SMRPanel smrPanel = new SMRPanel();

这里面对象我有一个JButton convertArchiveButton我从Controller

​​

这里添加的ActionListener是在听者的实施控制器

private class ConvertArchiveButtonListener implements ActionListener { 
    @Override 
    public void actionPerformed(ActionEvent event) { 
      converter.convert(); 
    } 
} 

converter是做冗长的操作

File[] listOfFiles = folder.listFiles(); 

for (int file = 0; file < listOfFiles.length; file++) { 

    int progress = Math.round(file * 100/listOfFiles.length); 

    //tried a lot of things here... 

    //...computing 

} 

例如我尝试添加一些新的RunnableEventQueueSwingUtilities,但没有工作的类。 A SwingWorker类会很有用?不太了解使用情况。

基本上,int progress将被传递给SMRPanel中的JProgressBar

与ControlAltDel答案编辑:

还不行,converter.readFile(file);不会被调用。

private class ConvertArchiveButtonListener implements ActionListener { 
    @Override 
    public void actionPerformed(ActionEvent event) { 
     File[] listOfFiles = folder.listFiles(); 

     System.out.println(listOfFiles.length); 

     for (int i = 0; i < listOfFiles.length; i++) { 
      final File file = listOfFiles[i]; 
      final int idx = (i * 100)/listOfFiles.length; 
      Thread t = new Thread(new Runnable() { 
       public void run() { 
        converter.readFile(file); 

        System.out.println(idx); 

        SwingUtilities.invokeLater(new Runnable() { 

         @Override 
         public void run() { 
          smrPanel.setProgressBarValue(idx); 
         } 
        }); 
       } 
      }); 

      try { 
       t.start(); 
       t.join(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     converter.convert(year); 

    } 
} 
+0

基本上,你需要你的可运行在任何线程但EDT执行。 EventQueue和SwingUtilities仅向美国东部时间发送。是的,一个SwingWorker会在这方面做得很好:对于[示例](http://stackoverflow.com/questions/16288303/best-example-for-programmatically-creating-splashscreen-with-text/16289376#16289376)。 –

+0

对不起,请试试{t.start(); t.join(); } ... – ControlAltDel

+0

我修改了我的代码...我犯了一个错误,可能会导致文件处理线程完成,并且调整ProcessBar不按顺序进行。我已经修复了这个问题 – ControlAltDel

回答

3

你的问题是你正在EDT线程中运行你的循环。由EDT在另一个线程运行此,再设置更新进度值修正处理完一个文件

private class ConvertArchiveButtonListener implements ActionListener { 
    @Override 
    public void actionPerformed(ActionEvent event) { 
      new Thread(new Runnable() { 
      public void run() { 
       for (int file = 0; file < listOfFiles.length; file++) { 
        final File f = listOfFiles[i]; 
        final idx = file; 
        Thread t = new Thread(new Runnable() { 
        converter.convert(f); 
        swingUtilities.invokeLater(new Runnable() { 
         myProgressBar.setValue(idx); 
        }); 
        t.start(); 
        t.join(); 
        }); 
       } 
      }).start(); 
    } 
} 
+0

我试图实现这一点,但没有工作,我更新了我的问题,最后的尝试 – Benoit