Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing ProgressBar在计算时更新_Java_Swing_Swingworker_Jprogressbar_Swingutilities - Fatal编程技术网

Java Swing ProgressBar在计算时更新

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

类似的问题有一些例子 ()和(),但不知道如何使其适用于我的代码

My main有两个面板,一个在另一个上(其中一个是带有两个选项卡的选项卡式窗格)

重要的一点是这个对象:
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

}

您的问题是您正在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