出于某种原因,当我在main中运行代码时它可以工作,但是目前我只有在JButton
时运行代码import java.awt.Color;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
public class JavaCompilingJOP {
private JFrame framed = new JFrame();
private JProgressBar bar = new JProgressBar(0,100); //0 through 100 is the compiling until reaches that number
private Color startProgress = Color.RED;
private int loadingPercent = 0;
public JavaCompilingJOP(){
framed.setLayout(null);
framed.setSize(500, 200);
framed.setTitle("Compiling JOptionPane...");
framed.setLocationRelativeTo(null);
//Ok now lets make the GUI happen boys!
framed.getContentPane().setBackground(Color.BLACK); //Because startProgress is ze theme of ze game!
bar.setForeground(startProgress);
bar.setStringPainted(true);
bar.setValue(loadingPercent);
bar.setString(loadingPercent + "%");
bar.setBounds(50, 50, 400, 100);
framed.add(bar);
System.out.println("Make visible an run!");
framed.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
framed.setResizable(false);
framed.setVisible(true);
doTimer();
}
private void doTimer(){
Random obj = new Random();
for(int i = 0; i < 100; i++){
loadingPercent++;
bar.setValue(loadingPercent); //Updates counter
bar.setString(loadingPercent + "%"); //Updates progressbar
startProgress = new Color(startProgress.getRed()-2,startProgress.getGreen()+2,startProgress.getBlue());
bar.setForeground(startProgress);
try{Thread.sleep(100 + obj.nextInt(200));}catch(Exception E){}
}
System.out.println("Java compiled!");
framed.setVisible(false);
}
}
出于某种原因,我所得到的只是一个白色的屏幕似乎忽略了处理关闭,因为当我点击它关闭它时......它也没有。 请记住,当我在main中运行它时它可以工作,但是当在按钮的ActionListener内部时,它会给我一个空白屏幕,它仍然执行它的进度条。 我坚持这个。
答案 0 :(得分:1)
您的JButton的 actionPerformed()代码在Java event dispatch thread (EDT)
上执行,这就是GUI“冻结”并且您看到黑屏的原因。
这样做也会阻止执行“关闭”事件以及任何其他挥杆事件
重要:强>
EDT是一个特殊的线程,应该非常小心处理
请花点时间阅读 EDT 以及如何正确使用它here。
正确的方法:
doTimer()应该从不在Java事件调度线程(EDT)上运行,因为它模拟(我希望)一些长期运行的任务。
为确保我们正确处理EDT,我们使用SwingWorker
SwingWorkers是一种特殊的构造,旨在在后台线程中执行冗长的GUI交互任务
由于这是第一次处理有点棘手,我为您添加了以下代码:
@Override
public void actionPerformed(ActionEvent e) {
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
// Code here will be executed in a background thread
// This is where all background activities should happen.
doTimer();
return null;
}
};
sw.execute();
// doTimer(); Bad Idea as this will execute on EDT!
}