Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Progress bar 
:(
    Опции темы
pavelslap
  Дата 12.8.2013, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 27.11.2009

Репутация: нет
Всего: нет



Добрый день. Задача сделать строку "выполняется задача" с процентами. Проценты показываются в зависимости от того, насколько выполнены действия. Сами действия - это разрезка картинки на маленькие куски через скрипт php (думаю это не столь важно). Для этого у меня сделан отдельный блок в программе. Нарезка картинки (подпрограмма) вызывается так:
Код

DocSplitter d = new DocSplitter();
d.splitBlock(1);
d.splitBlock(2);

Пока работает этот процесс или действия (а занять он может секунд 30), будут наполнятся проценты. На данный момент я сделал наполнение процентами, но они работают вне зависимости от нарезки фоток. То есть сначала срабатывает нарезка, а затем открывается окно с процентами. А надо всё это объединить. Не подскажете куда копать? Может это многопоточность. Вот код того, что у меня есть на данный момент (те строки, которые я приводил выше закомментированы).
Код

package app;

ЗДЕСЬ ИМПОРТЫ

public class Scene4Controller extends JPanel
        implements Initializable, PropertyChangeListener {

    private WinLoader dialogs = new WinLoader();
    @FXML //  fx:id="backButton"
    private Button backButton; // Value injected by FXMLLoader
    private Button nextButton;
    private ProgressMonitor progressMonitor;
    private JTextArea taskOutput;
    private Task task;

    class Task extends SwingWorker<Void, Void> {

        @Override
        public Void doInBackground() {
            Random random = new Random();
            int progress = 0;
            setProgress(0);
            try {
                Thread.sleep(1000);
                while (progress < 100 && !isCancelled()) {
                    //Sleep for up to one second.
                    Thread.sleep(random.nextInt(1000));
                    //Make random progress.
                    progress += random.nextInt(10);
                    setProgress(Math.min(progress, 100));
                }
            } catch (InterruptedException ignore) {
            }
            return null;
        }

        @Override
        public void done() {
            Toolkit.getDefaultToolkit().beep();
            //nextButton.setEnabled(true);
            progressMonitor.close();
        }
    }

    public Scene4Controller() {
        //nextButton.setActionCommand("start");
        //nextButton.addActionListener(this);
        taskOutput = new JTextArea(5, 20);
        taskOutput.setMargin(new Insets(5, 5, 5, 5));
        taskOutput.setEditable(false);
    }

    public void propertyChange(PropertyChangeEvent evt) {
        if ("progress" == evt.getPropertyName()) {
            int progress = (Integer) evt.getNewValue();
            progressMonitor.setProgress(progress);
            String message =
                    String.format("Completed %d%%.\n", progress);
            progressMonitor.setNote(message);
            taskOutput.append(message);
            if (progressMonitor.isCanceled() || task.isDone()) {
                Toolkit.getDefaultToolkit().beep();
                if (progressMonitor.isCanceled()) {
                    task.cancel(true);
                    taskOutput.append("Task canceled.\n");
                } else {
                    taskOutput.append("Task completed.\n");
                }
                //nextButton.setEnabled(true);
            }
        }

    }

    // Handler for Button[fx:id="backButton"] onAction
    public void handleBackButtonAction(ActionEvent event) {
        try {
            Stage stage = (Stage) backButton.getScene().getWindow();
            stage.setTitle("Take photo - reverse side");
            dialogs.switchPage(stage, "/app/Scene3.fxml");
        } catch (Exception ex) {
            Logger.getLogger(Scene3Controller.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // Handler for Button[id="nextButton"] onAction
    public void handleNextButtonAction(ActionEvent event) throws FileNotFoundException, IOException {
        
        //DocSplitter d = new DocSplitter();
        //d.splitBlock(1);
        //d.splitBlock(2);
        
        progressMonitor = new ProgressMonitor(Scene4Controller.this, "Running a Long Task", "", 0, 100);
        progressMonitor.setProgress(0);
        task = new Task();
        task.addPropertyChangeListener(this);
        task.execute();

    }

    @Override // This method is called by the FXMLLoader when initialization is complete
    public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
        assert backButton != null : "fx:id=\"backButton\" was not injected: check your FXML file 'Scene4.fxml'.";

        // initialize your logic here: all @FXML variables will have been injected

    }
}

PM MAIL   Вверх
Mirkes
Дата 13.8.2013, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 7
Всего: 17



Вообще, по хорошему, долгие операции всегда должны выполняться в потоке, отличном от EDT.
А вот диалог демонстрации процентов или progressBar как раз должен работать в потоке EDT.
выводом процентов никогда не занимался а вот прогресс бар использовал.

Если интересно, то вот код моего прогресс бара
Код

package myProgress;

import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;

import javax.swing.SwingUtilities;

import myGBL.AddGBL;

public class PBDialogFree extends JDialog {
    @SuppressWarnings("compatibility:1281032496474731956")
    private static final long serialVersionUID = 1878375339029727519L;

    private JProgressBar pb = new JProgressBar();
    private PBDialogFree pbf;

    public PBDialogFree(String title, int max) {
        this(null, title, max);
    }

    public PBDialogFree(JDialog window, String title, int max) {
        super(window, title, true);
        this.setDefaultCloseOperation(0);
        this.getContentPane().setLayout(new FlowLayout());
        pb.setSize(200, 20);
        this.getContentPane().add(pb);
        pb.setMinimum(0);
        pb.setMaximum(max);
        setLocationRelativeTo(null);
        pack();
        pbf = this;
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                pbf.setVisible(true);
            }
        });
    }

    public void step() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                pb.setValue(pb.getValue() + 1);
            }
        });
    }

    public void stop() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                pbf.setVisible(false);
            }
        });
    }
}



А вот пример его использования:
Код

    private void getMap() {
        Thread tl = new Thread(new Runnable() {
            public void run() {
                PBDialogFree pbf = new PBDialogFree("Scanning map", nX * nY);
//Что-то делаем
                    for (int i = 0; i < nX; i++) {
                        for (int j = 0; j < nY; j++) {
//выполнили один шаг - сообщили

                            pbf.step();
                        }
                    }
// Закрыли диалог
                pbf.stop();
            }
        });
        tl.start();
    }


Прелесть этого диалога еще в том, что он модальный и пользователь не сможет нажимать кнопки меню, пока он открыт.
Неприятность в том, что если метод слетел, то диалог не закрывается и блокирует графическую оболочку smile



--------------------
Mirkes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0785 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.