JProgressBar от Oracle

Я загрузил небольшой Java-проект с веб-сайта oracle, чтобы создать индикатор выполнения.

Я понимаю это, но мне нужно применить его по-другому, приложение создает поток в фоновом режиме, поэтому индикатор выполнения может быть обновлен соответствующим образом (doInBackground()).

У меня вопрос: как я могу заменить этот вид процесса в фоновом режиме в этом приложении методом из моего приложения (метод просто выполняет своего рода пакетную обработку в базе данных), может ли кто-нибудь помочь?

Вот код Oracle:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.beans.*; 
import java.util.Random;


public class ProgressBarDemo2 extends JPanel
       implements ActionListener, PropertyChangeListener {

private JProgressBar progressBar;
private JButton startButton;
private JTextArea taskOutput;
private Task task;

class Task extends SwingWorker<Void, Void> {
    /*
     * Main task. Executed in background thread.
     */
    @Override
    public Void doInBackground() {
        Random random = new Random();
        int progress = 0;
        //Initialize progress property.
        setProgress(0);
        //Sleep for at least one second to simulate "startup".
        try {
            Thread.sleep(1000 + random.nextInt(2000));
        } catch (InterruptedException ignore) {}
        while (progress < 100) {
            //Sleep for up to one second.
            try {
                Thread.sleep(random.nextInt(1000));
            } catch (InterruptedException ignore) {}
            //Make random progress.
            progress += random.nextInt(10);
            setProgress(Math.min(progress, 100));
        }
        return null;
    }

    /*
     * Executed in event dispatch thread
     */
    public void done() {
        Toolkit.getDefaultToolkit().beep();
        startButton.setEnabled(true);
        taskOutput.append("Done!\n");
    }
}

public ProgressBarDemo2() {
    super(new BorderLayout());

    //Create the demo's UI.
    startButton = new JButton("Start");
    startButton.setActionCommand("start");
    startButton.addActionListener(this);

    progressBar = new JProgressBar(0, 100);
    progressBar.setValue(0);

    //Call setStringPainted now so that the progress bar height
    //stays the same whether or not the string is shown.
    progressBar.setStringPainted(true); 

    taskOutput = new JTextArea(5, 20);
    taskOutput.setMargin(new Insets(5,5,5,5));
    taskOutput.setEditable(false);

    JPanel panel = new JPanel();
    panel.add(startButton);
    panel.add(progressBar);

    add(panel, BorderLayout.PAGE_START);
    add(new JScrollPane(taskOutput), BorderLayout.CENTER);
    setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
}

/**
 * Invoked when the user presses the start button.
 */
public void actionPerformed(ActionEvent evt) {
    progressBar.setIndeterminate(true);
    startButton.setEnabled(false);
    //Instances of javax.swing.SwingWorker are not reusuable, so
    //we create new instances as needed.
    task = new Task();
    task.addPropertyChangeListener(this);
    task.execute();
}

/**
 * Invoked when task's progress property changes.
 */
public void propertyChange(PropertyChangeEvent evt) {
    if ("progress" == evt.getPropertyName()) {
        int progress = (Integer) evt.getNewValue();
        progressBar.setIndeterminate(false);
        progressBar.setValue(progress);
        taskOutput.append(String.format(
                    "Completed %d%% of task.\n", progress));
    }
}

/**
 * Create the GUI and show it. As with all GUI code, this must run
 * on the event-dispatching thread.
 */
private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("ProgressBarDemo2");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    JComponent newContentPane = new ProgressBarDemo2();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}

Ваше приложение предоставляет API ??? Я объясняю себя, есть ли у вас какой-нибудь класс / метод, который запускает / запускает вашу пакетную обработку? Можете ли вы вызвать такой метод из doInBackground()?

Carlitos Way 02.01.2019 20:58

Кроме того, вы, похоже, не понимаете, как работает сравнение строк в Java.

MadProgrammer 02.01.2019 21:22

У меня нет какого-либо класса / метода для запуска / запуска моей пакетной обработки, это просто метод, который некоторое время запускается для автоматического создания таблиц по умолчанию и вставки также некоторых значений по умолчанию в эти таблицы, кроме того, мой вопрос действительно как вызвать мой метод из doInBackground ().

JAVADEV 03.01.2019 08:42

Что касается второго комментария, я перехожу с Cobol (MainFrame), который представляет собой совершенно другой мир, читаю, смотрю видео и получаю ответы на свои вопросы здесь, которые я узнаю.

JAVADEV 03.01.2019 08:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
81
1

Ответы 1

Во-первых, я бы порекомендовал, определив концепцию «прогрессирующего» состояния

public interface Progressable {
    public void setProgress(int progress); // I prefer double, but we'll keep it inline with the rest of the API
}

Тогда точка входа для ваших задач будет ссылаться на Progressable.

public class MySuperAwesomeLongRunningTask ... {
    //...
    private Progressable progressable;

    public void performTask(Progressable progressable) {
        this.prgressable = progressable
    }

    protected void methodThatDoesSomeWork() {
        // Do some super duper work...
        // calculate the progress of that work some how,
        // based on your implementation...
        int progress = ...;
        progressable.setProgress(progress);
    }
}

Затем создайте SwingWorker, который реализует Progressable и называет вашу работу ...

class Task extends SwingWorker<Void, Void> implements Progressable {
    private MySuperAwesomeLongRunningTask taskToBeDone;

    public Task(MySuperAwesomeLongRunningTask taskToBeDone) {
        self.taskToBeDone = taskToBeDone;
    }

    /*
     * Main task. Executed in background thread.
     */
    @Override
    public Void doInBackground() {
        taskToBeDone.performTask(this);
        return null;
    }

    /*
     * Executed in event dispatch thread
     */
    public void done() {
        // What ever you need to do...
    }
}

Теперь, поскольку SwingWorker уже имеет метод под названием setProgress(int), он автоматически соответствует Progressable (пока вы его реализуете), поэтому, когда MySuperAwesomeLongRunningTask вызывает setProgress, он фактически вызывает реализацию SwingWorkers.

Это означает, что остальная часть кода в основном остается прежней, ожидайте, я бы изменил

if ("progress" == evt.getPropertyName()) {

к

if ("progress".equals(evt.getPropertyName())) {

потому что сравнивать String с == - плохая идея (и пугает меня: P)

Другие вопросы по теме