3

UIからサーバー呼び出しがあります。応答時間が少し長いです。そのため、サーバーからのデータの読み込み中にプログレスバーを表示することを考えていました。このアプローチを使用して次のコードを試し、プログレスバーを表示しました。私が間違っているところのいくつかは、calculateResult()ボタンクリックでメソッドを呼び出したときにプログレスバーが表示されません。プログレスバーにパーセンテージを表示する必要はありません。データが読み込まれていることを示す必要があります。

//私が試した次のコード。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

 public class MyProgressBarTest extends JFrame {
private static final long serialVersionUID = 1L;

private static JProgressBar progressBar;

public static void main(String[] args) {
    MyProgressBarTest obj = new MyProgressBarTest();
    obj.createGUI();
}

public void createGUI() {
    JPanel panel = new JPanel();
    JButton button = new JButton("Progress");

    progressBar = new JProgressBar();

    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {

            MyCustomProgressBarDialog progressBarObj = new    MyCustomProgressBarDialog(progressBar);
            progressBarObj.createProgressUI();

            MyActionPerformer actionObj = new MyActionPerformer(progressBar);
            actionObj.execute();

            progressBarObj.setVisible(false);
        }
    });

//      panel.add(progressBar);
    panel.add(button);
    add(panel);

    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    setLocationRelativeTo(null);
//      pack();
    setSize(200, 300);
    setVisible(true);
}
}

class MyActionPerformer extends SwingWorker<String, Object> {

JProgressBar fProgressBar;

public MyActionPerformer(JProgressBar progressBar) {
    this.fProgressBar = progressBar;
    this.fProgressBar.setVisible(true);
    this.fProgressBar.setIndeterminate(true);
}

protected String doInBackground() throws Exception {

    calculateResult();
    return "Finished";
}

protected void done() {
    fProgressBar.setVisible(false);
}

public void calculateResult() {
    for (int i = 0; i < 500000; i++) {
        System.out.println("Progress Bar: " + i);
    }
}
}

class MyCustomProgressBarDialog extends JDialog {
private static JProgressBar progressBar;

public MyCustomProgressBarDialog(JProgressBar progressBar) {
    this.progressBar = progressBar;
}

public void createProgressUI() {
    add(progressBar);
    setLocationRelativeTo(null);
    setSize(50, 20);
    setVisible(true);
}
}
4

3 に答える 3

5

プログレスバーがすぐに消える理由はあなたですActionListener

button.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent arg0) {
   MyCustomProgressBarDialog progressBarObj = new    MyCustomProgressBarDialog(progressBar);
   progressBarObj.createProgressUI();

   MyActionPerformer actionObj = new MyActionPerformer(progressBar);
   actionObj.execute();

   progressBarObj.setVisible(false);
  }
});

メソッドはブロックされactionObj.execute();ていません (良いことであるか、役に立たないか)。つまり、その呼び出しで を開始した直後にステートメントSwingWorkerを実行します。progressBarObj.setVisible(false);

これにより、プログレス バー ダイアログが消えます。

これには2つの解決策が考えられます

  • ダイアログを にも渡し、のメソッドでダイアログSwingWorkerを呼び出します。setVisible( false )doneSwingWorker
  • Aは s をSwingWorker発火PropertyChangeEventし、それがどれだけ進行したかを判断できるようにします。このようなリスナーを使用して、計算が終了したときにダイアログを非表示にすることができます
于 2012-11-13T19:43:10.497 に答える
1

パネルに追加していないため、進行状況バーが表示されません

シンプルな:

panel.add(PROGRESS_BAR);
panel.add(button);

トリックを行います。

お役に立てば幸いです。乾杯

于 2012-11-13T18:53:12.267 に答える
1

JProgressBarですComponent。表示するには、 に追加する必要がありContainerます。あなたは自分のものをどこにも追加していません。

于 2012-11-13T18:53:21.817 に答える