java创建进度条刷新JDialog
我正在尝试用Java实现一个ProgressJDialog。我正在解析文件,我希望JDialog在开始解析新文件后刷新。我的问题是JDialog没有刷新。我试图重新绘制它,或者调整它的大小,以便它可以重新绘制。我还试图删除标签,并添加一个新的
ProgressDialog类:
public class ProgressDialog extends javax.swing.JDialog {
private JLabel jLabel1;
public ProgressDialog(Window frame) {
super(frame);
this.setResizable(false);
this.setLocationRelativeTo(frame);
initGUI();
//this.setVisible(true);
}
private void initGUI() {
try {
{
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
getContentPane().setLayout(null);
{
jLabel1 = new JLabel();
getContentPane().add(jLabel1);
jLabel1.setText("In Progress..");
jLabel1.setBounds(12, 12, 215, 52);
jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
}
}
this.setSize(255, 114);
} catch (Exception e) {
e.printStackTrace();
}
}
public void setText(String s){
this.setVisible(true);
jLabel1.setText(s);
this.resize(this.getSize());
this.repaint();
}
}
我如何使用它:
ProgressDialog pd = new ProgressDialog(frame);
for(File file:files){
pd.setText("Parsing " + file + ".");
...
}
# 1 楼答案
我猜您正在EDT(事件调度线程)中执行文件解析。但是调用repaint()实际上会在EventQueue上推送一个事件,当您当前对EDT的调用完成时,该事件将被调度。由于您正在阻止EDT,因此仅当您执行了所有作业时才会重新绘制,因此您永远不会看到进度条的刷新/重新绘制
您应该做的是使用SwingWorker将解析作业放在单独的线程中,并保持EDT未被阻止。有很多关于如何在SO或Web上使用SwingWorker的示例
# 2 楼答案
您应该在工作线程上执行文件解析,并在事件Dispath线程上更新进度对话框。有几个链接值得一读:
SwingWorker
类的一个示例