有一些类似的问题 (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
}
例如我尝试添加一些新的Runnable
既EventQueue
和SwingUtilities
,但没有工作的类。 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);
}
}
基本上,你需要你的可运行在任何线程但EDT执行。 EventQueue和SwingUtilities仅向美国东部时间发送。是的,一个SwingWorker会在这方面做得很好:对于[示例](http://stackoverflow.com/questions/16288303/best-example-for-programmatically-creating-splashscreen-with-text/16289376#16289376)。 –
对不起,请试试{t.start(); t.join(); } ... – ControlAltDel
我修改了我的代码...我犯了一个错误,可能会导致文件处理线程完成,并且调整ProcessBar不按顺序进行。我已经修复了这个问题 – ControlAltDel