Display-Popup-Fenster mit ProgressBar in JavaFX
Wie kann ich meine progress bar durch pop-up und automatisch schließen, wenn Vorgang beendet ist. Hier ist mein code.
Task<ProgressForm> task = new Task<ProgressForm>() {
@Override
public ProgressForm call() throws InterruptedException{
ProgressForm pf = new ProgressForm();
for (int i = 1; i <= 10; i++) {
pf.activateProgressBar(this);
updateProgress(i, 10);
}
return pf;
}
};
task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
ProgressForm pf = (ProgressForm)task.getValue();
pf.getDialogStage().close();
}
});
Thread th = new Thread(task);
th.run();
Fortschritt form-Klasse:
private final Stage dialogStage;
private final ProgressBar pb = new ProgressBar();
private final ProgressIndicator pin = new ProgressIndicator();
public ProgressForm() {
dialogStage = new Stage();
dialogStage.initStyle(StageStyle.UTILITY);
dialogStage.setResizable(false);
dialogStage.initModality(Modality.APPLICATION_MODAL);
//PROGRESS BAR
final Label label = new Label();
label.setText("alerto");
pb.setProgress(-1F);
pin.setProgress(-1F);
final HBox hb = new HBox();
hb.setSpacing(5);
hb.setAlignment(Pos.CENTER);
hb.getChildren().addAll(pb, pin);
Scene scene = new Scene(hb);
dialogStage.setScene(scene);
}
public void activateProgressBar(final Task task) throws InterruptedException {
pb.progressProperty().bind(task.progressProperty());
pin.progressProperty().bind(task.progressProperty());
dialogStage.show();
}
public Stage getDialogStage() {
return dialogStage;
}
Das problem mit diesem code ist
- wenn ich .show(), die Anzeige von pop-up ist weich, aber KEINE Fortschrittsanzeige.
- wenn ich .showAndWait(), anzeigen von pop-up manuelle Ausfahrt für das pop-up zu schließen, ABER der Fortschritt Balken zeigt.
Irgendwelche Gedanken/Ideen dazu?
InformationsquelleAutor user3247087 | 2015-04-14
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den zwei Regeln für multithreading in JavaFX sind:
Stage
oder ändert die Eigenschaftender Knoten, die Teil eines scene graph) muss ausgeführt werden
JavaFX-Application-thread. Verstoss gegen diese Regel wird entweder werfen
IllegalStateException
s oder unvorhersehbarem Verhalten führen.Ihren code verstößt gegen die erste Regel, denn er fordert die
ProgressForm
- Konstruktor in einen hintergrund-thread. Sollten Sie die Benutzeroberfläche zuerst zeigen Sie das Dialogfeld, und starten Sie dann die hintergrund-thread.Beachten Sie, dass es gibt keine Notwendigkeit, immer wieder binden die
progress
Eigenschaften der Fortschrittsbalken und die Anzeige derprogress
- Eigenschaft der Aufgabe. Sobald es gebunden ist, es bleibt gebunden, bis und es sei denn, Sie lösen es.Es ist ziemlich schwer zu beheben ist, Ihren code so wie es da steht, weil Ihr hintergrund der Aufgabe nicht wirklich etwas zu tun, nimmt sich jeder Zeit. Hier ist eine version von dem, was Sie tun mit nur einer pause:
Sie lief den genauen code, den ich gepostet? Es funktionierte gut für mich. Was JDK und Betriebssystem verwenden Sie?
in der Lage war zu beheben, eine lil-mein problem. jetzt muss ich fix, wie zu vermeiden, UI-block-immer wenn ich call waitFor für einen bestimmten Prozess. scheint, wie meine Statusleiste nicht angezeigt wird aufgrund von waitFor().
waitFor() ist ein blockierender Aufruf, so dass, wenn Sie nennen es auf der FX Application Thread, der UI nicht mehr reagiert (in der Regel 2 oben). Wenn die Benutzeroberfläche nicht reagiert, wird es nicht gerendert wird, so dass Sie nicht sehen, den Inhalt des Dialogfelds. Es gibt keine Notwendigkeit, rufen Sie waitFor(). Wenn es code, den Sie ausführen müssen, nachdem die Aufgabe erledigt ist, führen Sie es in die onSucceeded handler.
Die integer-division durch null in der ersten iteration verwirrt. Verwenden
100.0/i
statt100/i
.InformationsquelleAutor James_D
Können Sie controlsfx-Bibliothek an, um diese leicht
nun müssen Sie rufen Sie die Methode progressDialogue();
der code ist aus diesem video : https://www.youtube.com/watch?v=DK_1YGLI9ig
InformationsquelleAutor Amirouche Zeggagh