Java Swing ProgressBar在计算时更新
类似的问题有一些例子 ()和(),但不知道如何使其适用于我的代码 My main有两个面板,一个在另一个上(其中一个是带有两个选项卡的选项卡式窗格) 重要的一点是这个对象:Java Swing ProgressBar在计算时更新,java,swing,swingworker,jprogressbar,swingutilities,Java,Swing,Swingworker,Jprogressbar,Swingutilities,类似的问题有一些例子 ()和(),但不知道如何使其适用于我的代码 My main有两个面板,一个在另一个上(其中一个是带有两个选项卡的选项卡式窗格) 重要的一点是这个对象:SMRPanel SMRPanel=new SMRPanel() 在这个对象中,我有一个JButtonconvertArchiveButton,我从Controller类添加了一个ActionListener public void addConvertArchiveButton(ActionListener ConvertA
SMRPanel SMRPanel=new SMRPanel()代码>
在这个对象中,我有一个JButtonconvertArchiveButton
,我从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
}
您的问题是您正在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();
}
}
私有类ConvertArchiveButtonListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件){
新线程(newrunnable()){
公开募捐{
对于(int file=0;file
您的问题是,您正在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();
}
}
私有类ConvertArchiveButtonListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件){
新线程(newrunnable()){
公开募捐{
对于(int file=0;file
您的问题是,您正在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();
}
}
私有类ConvertArchiveButtonListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件){
新线程(newrunnable()){
公开募捐{
对于(int file=0;file
您的问题是,您正在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();
}
}
私有类ConvertArchiveButtonListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件){
新线程(newrunnable()){
公开募捐{
对于(int file=0;file
基本上,您需要在任何线程中执行runnable,但EDT.EventQueue和SwingUtilities仅调度到EDT。是的,SwingWorker将在这方面做得很好:例如。对不起,应该尝试{t.start();t.join();}…我修改了我的代码…我犯了一个错误,可能会导致文件处理线程完成,并且无法按顺序调整ProcessBar。我现在已修复this@ControlAltDel这是按照你一开始的想法做的,但是更新成功了DT.EventQueue和SwingUtilities只发送到EDT。是的,SwingWorker在这方面会做得很好:例如。对不起,应该试试{t.start();t.join();}…我修改了我的代码…我犯了一个错误,可能会导致文件处理线程完成,并且无法按顺序调整ProcessBar。我现在已修复this@ControlAltDel这是按照你一开始的想法做的,但是更新成功了DT.EventQueue和SwingUtilities只发送到EDT。是的,SwingWorker在这方面会做得很好:例如。对不起,应该试试{t.start();t.join();}…我修改了我的代码…我犯了一个错误,可能会导致文件处理线程完成,并且无法按顺序调整ProcessBar。我现在已修复this@ControlAltDel这正是你一开始所想的,但是更新成功了。基本上,你需要你的runnable