Как добавить индикатор выполнения? - PullRequest
5 голосов
/ 18 января 2012

Я пытался понять, как добавить индикатор выполнения, я могу создать его в графическом интерфейсе, который я внедряю, и заставить его отображаться, но даже после проверки через http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html Я все еще не понимаю, как Можно установить метод в качестве задачи, чтобы я мог создать индикатор выполнения для запуска метода. Пожалуйста, кто-нибудь может попытаться объяснить это мне или опубликовать пример индикатора выполнения, который используется в графическом интерфейсе с заданием в качестве метода. Спасибо.

Ответы [ 4 ]

14 голосов
/ 19 января 2012

Может быть, я могу помочь вам с примером кода:

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) {
        ;
      }
    }
  }
}
5 голосов
/ 18 января 2012

Ваш вопрос немного расплывчатый, но мне кажется, что вы хотите, чтобы индикатор выполнения отображал прогресс для определенного метода выполнения, который я назову методом "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)на индикаторе выполнения.

2 голосов
/ 19 января 2012

См. мой ответ на другой вопрос SO , который включает в себя пример JProgressBar, который обновляется с использованием SwingWorker. SwingWorker используется для выполнения долгосрочной задачи в фоновом режиме (в данном примере это просто обычная Thread.sleep) и отчета о ходе выполнения через определенные промежутки времени.

Я бы также настоятельно рекомендовал взглянуть на учебник по параллелизму Swing для получения дополнительной информации о том, почему вы должны использовать SwingWorker при выполнении долгосрочных задач, которые мешают работе пользовательского интерфейса.

Пример, аналогичный тому, который я опубликовал, доступен в учебнике Swing о JProgressBar s , который также стоит посмотреть на

0 голосов
/ 09 июля 2019

Как насчет этого,

  1. JFrame-> JButton (BorderLayout.NORTH)

  2. JFrame-> JPanel-> JProgressBar (BorderLayout.ЮГ)

  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();
                }
    
            }
        });
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...