1

我正在尝试在 Java 中实现一个进度 JDialog。我正在解析文件,我希望 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 + ".");

    ...

}
4

2 回答 2

4

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

于 2012-04-24T10:11:30.910 回答
3

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

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

于 2012-04-24T10:10:04.443 回答