Добрый день. Задача сделать строку "выполняется задача" с процентами. Проценты показываются в зависимости от того, насколько выполнены действия. Сами действия - это разрезка картинки на маленькие куски через скрипт 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
} }
|
|