Добрый день. Задача сделать строку "выполняется задача" с процентами. Проценты показываются в зависимости от того, насколько выполнены действия. Сами действия - это разрезка картинки на маленькие куски через скрипт php (думаю это не столь важно). Для этого у меня сделан отдельный блок в программе. Нарезка картинки (подпрограмма) вызывается так:
Код:
DocSplitter d = new DocSplitter();
d.splitBlock(1);
d.splitBlock(2);
Пока работает этот процесс или действия (а занять он может секунд 30), будут наполнятся проценты. На данный момент я сделал наполнение процентами, но они работают вне зависимости от нарезки фоток. То есть сначала срабатывает нарезка, а затем открывается окно с процентами. А надо всё это объединить. Не подскажете куда копать? Может это многопоточность. Вот код того, что у меня есть на данный момент (те строки, которые я приводил выше закомментированы).
Код:
/**
* Sample Skeleton for "Scene4.fxml" Controller Class You can copy and paste
* this code into your favorite IDE
*
*/
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
}
}