Как отобразить индикатор выполнения?многопоточность Java - PullRequest
0 голосов
/ 26 сентября 2018

Я новичок в Java, так что извините, если я задаю глупый вопрос, но как мне создать новый поток в моем классе графического интерфейса, который будет создавать индикатор выполнения.У меня есть класс с именем progress и я создал новый поток в своем классе графического интерфейса, используя созданный мной конструктор.Но по какой-то причине я получаю странную ошибку:

"constructor progress in class NewJFrame.progress cannot be applied to given types;
  required: no arguments
  found: JProgressBar
  reason: actual and formal argument lists differ in length   

NewJframe.java

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
           if (jRadioButton1.isSelected()){   

          App m = new App();


      Thread t1 = new Thread(new progress(jProgressBar1));
      m.sendPingRequest2("104.160.142.3",jTextPane1,jTextPane2,jTextField1);


} 
    }    

progress.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author User
 */


import javax.swing.JProgressBar;
public class progress implements Runnable {


      private static int DELAY = 500;


  JProgressBar progressBar;



  public  progress (JProgressBar bar) {
    progressBar = bar;
  }


  public void run() {
    int minimum = progressBar.getMinimum();
    int maximum = progressBar.getMaximum();
    for (int i = minimum; i < maximum; i++) {
      try {
        int value = progressBar.getValue();
        progressBar.setValue(value + 1);

        Thread.sleep(DELAY);
      } catch (InterruptedException ignoredException) {
      }
    }
  }
}

1 Ответ

0 голосов
/ 26 сентября 2018

Это:

Thread t1= new progress ( jProgressBar1);

Должно быть:

Thread t1 = new Thread(new progress(jProgressBar1));

, поскольку ваш класс прогресса реализует Runnable и не расширяет Thread.

Также ваше сообщение об ошибке странное:

прогресс конструктора в классе NewJFrame.progress не может быть применен к указанным типам

, предполагая, что проблема находится в конструкторе класса NewJFrame.progress, класса, которыйвыглядит как вложенный в классе NewJFrame.Если это так, избавьтесь от вложенного класса и работайте только с автономным классом прогресса (переименуйте его, пожалуйста, в «Прогресс»).


Но, сказав это, ваш код имеет потенциалпроблемы, связанные с изменением состояния JProgressBar, компонента Swing, непосредственно из фонового потока, и это не является потокобезопасным для Swing.Гораздо лучше использовать SwingWorker и связать его с состоянием JProgressBar в соответствии со стандартным учебником JProgressBar (проверьте ссылку, пожалуйста).

Например:

import java.awt.event.KeyEvent;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import javax.swing.*;

@SuppressWarnings("serial")
public class ProgressFun extends JPanel {
    private JProgressBar progressBar = new JProgressBar(0, 100);

    public ProgressFun() {
        progressBar.setStringPainted(true);
        final JButton startProgress = new JButton("Start Progress");
        startProgress.setMnemonic(KeyEvent.VK_S);
        startProgress.addActionListener(l -> {
            startProgress.setEnabled(false);
            progressBar.setValue(0);
            final MyWorker myWorker = new MyWorker();
            myWorker.execute();

            myWorker.addPropertyChangeListener(pcEvent -> {
                if (pcEvent.getPropertyName().equals("progress")) {
                    int value = (int) pcEvent.getNewValue();
                    progressBar.setValue(value);
                } else if (pcEvent.getNewValue() == SwingWorker.StateValue.DONE) {
                    startProgress.setEnabled(true);
                    try {
                        myWorker.get();
                    } catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace();
                    }
                }
            });
        });

        add(progressBar);
        add(startProgress);
    }

    private static void createAndShowGui() {
        ProgressFun mainPanel = new ProgressFun();

        JFrame frame = new JFrame("Progress Fun");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

class MyWorker extends SwingWorker<Void, Integer> {

    @Override
    protected Void doInBackground() throws Exception {
        int progress = 0;
        setProgress(progress);
        while (progress < 100) {
            progress += (int)(5 * Math.random());
            progress = Math.min(progress, 100);
            TimeUnit.MILLISECONDS.sleep((int) (500 * Math.random()));
            setProgress(progress);
        }
        return null;
    }
}

Кроме того, вы захотите изучить и использовать Соглашения об именах Java .Имена переменных должны начинаться со строчной буквы, а имена классов - с заглавной.Изучение этого и последующее позволит нам лучше понять ваш код и позволит вам лучше понять код других.

...