Java Swing ProgressBar更新的同时计算



有一些类似问题的例子(进度条Java)和(Java上载百分比进度条线程),但不知道如何使它为我的代码工作。

我的主界面有两个面板,一个在另一个上面(其中一个是有两个标签的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

public void addConvertArchiveButton(ActionListener ConvertArchiveButton) {
    convertArchiveButton.addActionListener(ConvertArchiveButton);
}

下面是控制器

中监听器的实现
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,但没有工作。SwingWorker类会有用吗?我不太明白它的用法。

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

EDIT WITH ControlAltDel answer:

仍然不工作,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);
    }
}

您的问题是您正在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();
    }
}

最新更新