Java 创建进度条-刷新JDialog

Java 创建进度条-刷新JDialog,java,swing,refresh,repaint,jdialog,Java,Swing,Refresh,Repaint,Jdialog,我正在尝试用Java实现一个ProgressJDialog。我正在解析文件,我希望JDialog在开始解析新文件后刷新。我的问题是JDialog没有刷新。我试图重新绘制它,或者调整它的大小,以便它可以重新绘制。我还试图删除标签,并添加一个新的 ProgressDialog类: public class ProgressDialog extends javax.swing.JDialog { private JLabel jLabel1; public ProgressDialo

我正在尝试用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 + ".");

    ...

}

我猜您正在EDT(事件调度线程)中执行文件解析。但是调用repaint()实际上会在EventQueue上推送一个事件,当您当前对EDT的调用完成时,该事件将被调度。由于您正在阻止EDT,因此仅当您执行了所有作业时才会重新绘制,因此您永远不会看到进度条的刷新/重新绘制


您应该做的是使用SwingWorker将解析作业放在单独的线程中,并保持EDT未被阻止。关于如何在SO或Web上使用SwingWorker,有很多示例。

我猜您正在EDT(事件调度线程)中执行文件解析。但是调用repaint()实际上会在EventQueue上推送一个事件,当您当前对EDT的调用完成时,该事件将被调度。由于您正在阻止EDT,因此仅当您执行了所有作业时才会重新绘制,因此您永远不会看到进度条的刷新/重新绘制


您应该做的是使用SwingWorker将解析作业放在单独的线程中,并保持EDT未被阻止。关于如何在SO或Web上使用SwingWorker,有很多示例。

您应该在工作线程上执行文件解析,并在事件Dispath线程上更新进度对话框。有几个链接值得一读:

  • :尽管它使用进度条显示进度,但您需要使用的机制是相同的。它包含一个
    SwingWorker
    类的示例
  • 演示SwingWorker类的使用并向用户显示进度

您应该在工作线程上执行文件解析,并在事件Dispath线程上更新进度对话框。有几个链接值得一读:

  • :尽管它使用进度条显示进度,但您需要使用的机制是相同的。它包含一个
    SwingWorker
    类的示例
  • 演示SwingWorker类的使用并向用户显示进度

感谢您提供的链接,我已经实现了,效果很好。感谢您提供的链接,我已经实现了,效果很好。感谢您的解释,为什么重新绘制不起作用,这对我帮助很大。我已经用SwingWorker实现了它,它工作得很好。谢谢你的解释,为什么重新绘制不起作用,这对我帮助很大。我已经用SwingWorker实现了它,它工作得很好。