0

重複の可能性:
Java GUI JProgressBar が描画されない

アクション イベントの処理中に GUI がロックされている GUI があるため、表示するにはプログレス バーが必要です。を表示させることはできますJDialogが、プログレス バーは表示されません。andを使用SwingUtilities.invokeLater()invokeAndWait()ましたが、役に立ちませんでした。プログレスバーは表示されません。ヒントやヘルプをいただければ幸いです。

pb = new JProgressBar(0, 100);
pb.setPreferredSize(new Dimension(175, 40));
pb.setString("Working");
pb.setStringPainted(true);
JLabel label = new JLabel("Progress: ");
JPanel center_panel = new JPanel();
center_panel.add(label);
center_panel.add(pb);
dialog = new JDialog((JFrame) null, "Working ...");
dialog.getContentPane().add(center_panel, BorderLayout.CENTER);
dialog.pack();
dialog.setLocationRelativeTo(this); // center on screen
dialog.toFront(); // raise above other java windows
SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
        dialog.setVisible(true);
        pb.setIndeterminate(true);
    }
});
Thread.sleep(5000);
template = AcronymWizardController
    .sharedInstance().readAndDislpayDocx(contdFile);
parseDocxText(contdFile);
pb.setIndeterminate(false);
savedFile.setText(contdFile.toString());
dialog.dispose();
4

1 に答える 1

4

SwingはシングルスレッドAPIです。つまり、すべてのUIの更新と変更は、シングルスレッド(イベントディスパッチスレッドまたはEDTと呼ばれます)内から実行されます。このスレッドをブロックすると、再描画などの追加の更新の処理が停止します。

選択肢はたくさんあります。差し迫った要件は、長時間実行されるタスクをEDTから移動することです。これを行うには、SwingWorkerまたはを使用できますThread

あなたの説明から、aSwingWorkerはより簡単になります。

簡単な例として、JProgressBarが更新されないことを確認してください

詳細については、Swingの同時実行性を確認してください。

他の選択肢は、ここの例のようなものを使用するProgressMonitorことです

于 2012-12-22T22:51:36.237 に答える