Java 在流程完成之前显示/更新组件

Java 在流程完成之前显示/更新组件,java,swing,executorservice,Java,Swing,Executorservice,我目前有一个带有swing gui的java程序,它允许用户选择各种文件(xsl fo和xml),并使用Render X生成PDF。我尝试了一段时间,以便在按下按钮时显示一个弹出JFrame,然后显示一个进度条或标签,让用户随时了解进度。但是,当实例化一个新帧时,它将显示为黑色,或没有组件,然后在流程完成后显示 private void RunButtonActionPerformed(java.awt.event.ActionEvent evt) { ExecutorService

我目前有一个带有swing gui的java程序,它允许用户选择各种文件(xsl fo和xml),并使用Render X生成PDF。我尝试了一段时间,以便在按下按钮时显示一个弹出JFrame,然后显示一个进度条或标签,让用户随时了解进度。但是,当实例化一个新帧时,它将显示为黑色,或没有组件,然后在流程完成后显示

private void RunButtonActionPerformed(java.awt.event.ActionEvent evt) {

    ExecutorService executor = Executors.newFixedThreadPool(8);

    //for reach file to process)
    for (int i = 0; i < count; i++) {
        Runnable worker = new ProcessThreader(conf, i);
        executor.execute(worker);
    }

    executor.shutdown();
    JFrame PercentageFrame = new JFrame();
    PercentageFrame.setVisible(true);
    PercentageFrame.setSize(200, 200);
    PercentageFrame.repaint();

    while (!executor.isTerminated()) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            NarrowOptionPane.errorMessage("Interrupted: ", ex.getMessage());
        }
    }
    System.out.println("Complete");
}

我对线程/执行器和java swing还比较陌生,所以请轻松一点!感谢

从侦听器中执行的代码在事件调度线程上执行。因此Thread.sleep()导致EDT休眠,这意味着GUI无法响应事件或重新绘制自身


有关更多信息,请阅读上的Swing教程部分。本教程中介绍的一种解决方案是,对长时间运行的任务使用
SwingWorker
,并在结果可用时发布结果。

从侦听器中执行的代码在事件调度线程上执行。因此Thread.sleep()导致EDT休眠,这意味着GUI无法响应事件或重新绘制自身


有关更多信息,请阅读上的Swing教程部分。本教程中介绍的一种解决方案是使用
SwingWorker
执行长时间运行的任务,并在结果可用时发布结果。

您的
循环块
EDT
时,删除该选项,您的代码将正常工作

请参见下一个带有
ExecutorService
JProgressBar
的示例:

import java.awt.BorderLayout;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class Example extends JFrame {

    private static JProgressBar progress;

    public static void main(String[] args) {
        final JFrame f = new JFrame();
        progress = new JProgressBar();
        progress.setStringPainted(true);
        progress.setIndeterminate(true);
        ExecutorService newCachedThreadPool = Executors.newFixedThreadPool(1);
        for( int i =0; i<10;i++){
            final int j = i;
            Runnable r = new Runnable() {

                @Override
                public void run() {
                    progress.setString(j+"");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            newCachedThreadPool.submit(r);
        }
        f.getContentPane().add(progress,BorderLayout.CENTER);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
    }

}
导入java.awt.BorderLayout;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入javax.swing.JFrame;
导入javax.swing.JProgressBar;
公共类示例扩展了JFrame{
私有静态JProgressBar进程;
公共静态void main(字符串[]args){
最终JFrame f=新JFrame();
进度=新的JProgressBar();
进度。设置字符串绘制(真);
progress.setUndeterminate(true);
ExecutorService newCachedThreadPool=Executors.newFixedThreadPool(1);

对于(int i=0;i您的
while
循环块
EDT
,删除该项,您的代码将正常工作

请参见下一个带有
ExecutorService
JProgressBar
的示例:

import java.awt.BorderLayout;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class Example extends JFrame {

    private static JProgressBar progress;

    public static void main(String[] args) {
        final JFrame f = new JFrame();
        progress = new JProgressBar();
        progress.setStringPainted(true);
        progress.setIndeterminate(true);
        ExecutorService newCachedThreadPool = Executors.newFixedThreadPool(1);
        for( int i =0; i<10;i++){
            final int j = i;
            Runnable r = new Runnable() {

                @Override
                public void run() {
                    progress.setString(j+"");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            newCachedThreadPool.submit(r);
        }
        f.getContentPane().add(progress,BorderLayout.CENTER);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
    }

}
导入java.awt.BorderLayout;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入javax.swing.JFrame;
导入javax.swing.JProgressBar;
公共类示例扩展了JFrame{
私有静态JProgressBar进程;
公共静态void main(字符串[]args){
最终JFrame f=新JFrame();
进度=新的JProgressBar();
进度。设置字符串绘制(真);
progress.setUndeterminate(true);
ExecutorService newCachedThreadPool=Executors.newFixedThreadPool(1);

对于(int i=0;iremove
while
loop它必须帮助您,还可以从
ProcessThreader
更新您的百分比框架。remove
while
loop它必须帮助您,还可以从
ProcessThreader
更新您的百分比框架。作为参考,
SwingWorker
实现
可运行的
未来的
,&
>RunnableFuture
。作为参考,
SwingWorker
实现了
RunnableFuture
Future
,&
RunnableFuture