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

ワーカースレッドでファイルの解析を実行し、EventDispathThreadで進行状況ダイアログを更新する必要があります。読む価値のあるいくつかのリンク:

于 2012-04-24T10:11:30.910 に答える
3

EDT (Event Dispatching Thread) でファイルの解析を実行していると思います。しかし、repaint() を呼び出すと、実際には、EDT での現在の呼び出しが完了したときにディスパッチされる EventQueue に Event がプッシュされます。EDT をブロックしているため、すべてのジョブを実行したときにのみ再描画が行われ、進行状況バーの更新/再描画が表示されることはありません。

すべきことは、SwingWorker を使用して解析ジョブを別のスレッドに配置し、EDT をブロックしないままにすることです。SO または Web で SwingWorker を使用する方法については、多くの例があります。

于 2012-04-24T10:10:04.443 に答える