web-dev-qa-db-ja.com

プログレスバーを追加するにはどうすればよいですか?

プログレスバーを追加する方法を理解しようとしています。実装しているGUI内でプログレスバーを作成して表示することができますが、確認した後でも http://docs.Oracle.com/javase/tutorial /uiswing/components/progress.html メソッドを実行するためのプログレスバーを作成できるように、メソッドをタスクとして設定する方法がまだはっきりしていません。誰かが私にこれを説明しようとしたり、タスクがメソッドとして設定されたGUIで使用されているプログレスバーの例を投稿したりできますか?ありがとう。

6
John

たぶん私はいくつかのサンプルコードであなたを助けることができます:

public class SwingProgressBarExample extends JPanel {

  JProgressBar pbar;

  static final int MY_MINIMUM = 0;

  static final int MY_MAXIMUM = 100;

  public SwingProgressBarExample() {
    // initialize Progress Bar
    pbar = new JProgressBar();
    pbar.setMinimum(MY_MINIMUM);
    pbar.setMaximum(MY_MAXIMUM);
    // add to JPanel
    add(pbar);
  }

  public void updateBar(int newValue) {
    pbar.setValue(newValue);
  }

  public static void main(String args[]) {

    final SwingProgressBarExample it = new SwingProgressBarExample();

    JFrame frame = new JFrame("Progress Bar Example");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(it);
    frame.pack();
    frame.setVisible(true);

    // run a loop to demonstrate raising
    for (int i = MY_MINIMUM; i <= MY_MAXIMUM; i++) {
      final int percent = i;
      try {
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            it.updateBar(percent);
          }
        });
        Java.lang.Thread.sleep(100);
      } catch (InterruptedException e) {
        ;
      }
    }
  }
}
16
endian

あなたの質問は少し曖昧ですが、進行状況バーに特定の実行中のメソッドの進行状況を表示したいように思えます。これを「work()」メソッドと呼びます。残念ながら、メソッドへの参照をプログレスバーに渡すだけの方法はありません。メソッドは、プログレスバーに何を表示するかを明示的に指示する必要があります。これが私がすることです:

  1. プログレスバーの参照をwork()で使用できるようにします。これをwork()の引数として渡すか、work()のコードがプログレスバーへの参照を取得するために呼び出すことができるアクセサーメソッドを提供します。

  2. Work()内で、プログレスバーへの参照を取得した後(これを「pb」と呼びます。pb.setMinimum(0)およびpb.setMaximum(n)を呼び出します。ここで、nはメソッドのステップ数です。通過する。

  3. メソッドが各ステップを完了したら、pb.setValue(pb.getValue()+ 1);を呼び出します。

  4. メソッドの最後で、pb.setValue(0);を呼び出します。戻る前にプログレスバーをリセットします。

また、プログレスバーに文字列メッセージを表示する場合は、最初にpb.setStringPainted(true)を呼び出す必要があります。その後、pb.setString(string)を呼び出すとプログレスバーに表示されます。

5
CodeBlind

別のSO質問 に関する私の回答を参照してください。これには、JProgressBarを使用して更新されるSwingWorkerの例が含まれています。SwingWorkerは、長時間実行されるタスクをバックグラウンドで実行するために使用されます(例の場合、通常のThread.sleep)そして一定の間隔で進捗状況を報告します。

また、UIに干渉する長時間実行タスクを実行するときにSwingWorkerを使用する必要がある理由の背景情報については、 Swing同時実行チュートリアル を参照することを強くお勧めします。

私が投稿したものと同様の例が JProgressBarsに関するSwingチュートリアル にあります。これも一見の価値があります

2
Robin

これはどう、

  1. JFrame-> JButton(BorderLayout.NORTH)

  2. JFrame-> JPanel-> JProgressBar(BorderLayout.SOUTH)

  3. Progress progress = ...; state=true; progress.waitFor(); state=false;の場合など、好きな場所にボタンパーツを追加できます。

    private static void daa() {
        //Frame
        JFrame frame = new JFrame("Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        frame.setSize(frame.getWidth() + 55, frame.getHeight() + 55);
    
        //Button
        JButton jButton = new JButton("State");
        frame.add(jButton, BorderLayout.NORTH);
    
        //Progress Bar
        JProgressBar progressBar = new JProgressBar();
        progressBar.setIndeterminate(true);
    
        //Text for progress bar
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(progressBar);
        panel.add(new JLabel("Please wait......."), BorderLayout.PAGE_START);
    
        //linking
        panel.add(progressBar);
        frame.add(panel, BorderLayout.SOUTH);
    
        boolean[] state = {false};
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                state[0] = !state[0];
                state();
            }
    
            private void state() {
                if (state[0] == true) {
                    panel.hide();
                } else {
                    panel.show();
                }
    
            }
        });
    }
    
0
ibrahim mert