Индикатор выполнения для запуска одновременно с функцией (в другом классе) - PullRequest
2 голосов
/ 01 апреля 2012

Я создал форму, в которой присутствуют два компонента: кнопка и индикатор выполнения (перетаскивание Netbeans). Форма содержит основной метод, с которого запускается мое приложение. Я также создал другой класс, в котором я написал функцию.Что я хочу, чтобы при нажатии кнопки приложение переходило в функцию, и индикатор выполнения запускался одновременно с ней, а когда эта функция была завершена со своей функциональностью, индикатор выполнения отображался на 100%. Теперь эта функция может потребоваться в любое время.завершение, поэтому я не могу установить максимальное значение для индикатора выполнения. Итак, что делать в этом случае? Может кто-нибудь дать мне хороший пример.

Ответы [ 3 ]

4 голосов
/ 01 апреля 2012

Так как какую работу вы выполняете внутри так называемой «вызываемой функции», трудно сказать, что вы хотите в сценарии, хотя вы можете ставить свои строки как progressBar.setValue(someProgress); через равные промежутки времени с помощью *От 1002 * до true, и в конце функции вы можете просто сказать, что progressBar.setValue(100); и Indeterminate State здесь превратятся в false, так что это может показать это конечному пользователю.

Посмотрите на этот пример программы:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ProgressExample
{
    public static JProgressBar progressBar;

    private void createAndDisplayGUI()
    {
        JFrame frame = new JFrame("Progress Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(5, 5));

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

        JButton button = new JButton("START");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                progressBar.setIndeterminate(true);
                WorkingDialog wd = new WorkingDialog();
                wd.createAndDisplayDialog();
            }
        });

        contentPane.add(progressBar, BorderLayout.PAGE_START);
        contentPane.add(button, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setVisible(true);
    }   

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ProgressExample().createAndDisplayGUI();
            }
        });
    }
}

class WorkingDialog extends JDialog
{
    private String message = "HelloWorld";
    private int count = 0;
    private JTextField tfield;
    private Timer timer;

    private ActionListener timerAction = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            if (count == 10)
            {
                timer.stop();
                ProgressExample.progressBar.setIndeterminate(false);
                ProgressExample.progressBar.setValue(100);
                ProgressExample.progressBar.setStringPainted(true);
                dispose();
                return;
            }
            tfield.setText(tfield.getText() + message.charAt(count));
            count++;
        }
    };

    public void createAndDisplayDialog()
    {
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setLocationByPlatform(true);

        JPanel panel = new JPanel();
        tfield = new JTextField(10);

        panel.add(tfield);

        add(panel);
        pack();
        setVisible(true);

        timer = new Timer(1000, timerAction);
        timer.start();
    }
}

Итак, похоже, что вы пишете

ProgressExample.progressBar.setIndeterminate(false);
ProgressExample.progressBar.setValue(100);
ProgressExample.progressBar.setStringPainted(true);

после цикла while.

4 голосов
/ 01 апреля 2012
1 голос
/ 01 апреля 2012

Вы можете взглянуть на мой ответ в предыдущем вопросе SO , который содержит образец с использованием JProgressBar, который получает обновления от другого Thread с использованием SwingWorker. Возможность использования SwingWorker зависит от вашего варианта использования. Если для запуска функции требуется некоторое время, лучше использовать SwingWorker, чтобы избежать блокировки пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...