Java 在流程完成之前显示/更新组件
我目前有一个带有swing gui的java程序,它允许用户选择各种文件(xsl fo和xml),并使用Render X生成PDF。我尝试了一段时间,以便在按下按钮时显示一个弹出JFrame,然后显示一个进度条或标签,让用户随时了解进度。但是,当实例化一个新帧时,它将显示为黑色,或没有组件,然后在流程完成后显示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
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;iremovewhile
loop它必须帮助您,还可以从ProcessThreader
更新您的百分比框架。removewhile
loop它必须帮助您,还可以从ProcessThreader
更新您的百分比框架。作为参考,SwingWorker
实现可运行的,未来的,&>RunnableFuture
。作为参考,SwingWorker
实现了RunnableFuture
,Future
,&RunnableFuture
。