JavaFX ProgressIndicator Meldung wenn Task failed

Bitte aktiviere JavaScript!
Hallo zusammen,
ich kenne bis jetzt nur die folgenden Zustände eine ProgressIndicator:
- Determinate
- Indeterminate / busy
- Done
Frage:
Ist es möglich eine Error Messsage bzw. das Aussehen zu verändern wenn der Task auf Fehler geht? Ich habe in der API nichts gefunden aber folgenden Wiki eintragen gelesen:
https://wiki.openjdk.java.net/display/OpenJFX/ProgressIndicator+User+Experience+Documentation
Ich bin mir nicht sicher ob das Kapitel "Error message" am Ende einen Wunsch beschreibt oder ob es das dort beschrieben Verhalten wirklich gibt:
A Dynamic Error Message may be presented when a job fails. If presented, the progress bar is dismissed and an inline error message takes its place. The error message consists of an error icon and associated error text. The intended use for this feature is for situations where only the progress bar itself is being presented to the user, such as in a table display. In other contexts alternate presentations may be preferable.
Kennt jemand eine Möglichkeit wie man so etwas realisieren kann? Ich könnte den PI auf unsichtbar setzen und daneben ein Icon einblenden, aber das ist nicht wirklich schön.

Bin für jede Idee dankbar.
Gruß
Ralf
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
StackPane mit Label (z.B. in roter Farbe) oder TextArea (bei StackTrace) und oben drüber den ProgressIndicator
Per default ist der Text unsichtbar (visible=false) und der Indicator sichtbar (visible=true) - bei Fehler Text setzten und visibility tauschen.
Wenn's hübscher sein soll: statt Visibility mit der Opacity arbeiten. Bei Fehler ParallelTransition mit zwei FadeTransitions, bei der die eine die Opacity von 0 auf 1 bringt (Text) und die andere von 1 auf 0 (Indicator) - in ca 250ms. Dann gibt's nen netten Effekt.
 
Hallo dzim,
Danke für Deinen Input - das hört sich schon mal nach einem guten Plan an. Das mit dem Stack Panel verstehe ich soweit, aber
Bei Fehler ParallelTransition mit zwei FadeTransitions, bei der die eine die Opacity von 0 auf 1 bringt (Text) und die andere von 1 auf 0 (Indicator) - in ca 250ms.
müsstest Du mir bitte noch etwas genauer erklären, wenns geht vielleicht mit einem kleinen Beispiel.

LG Ralf
 
Java:
FadeTransition fade1 = new FadeTransition(Duration.millis(250), messageLabel);
fade1.setFromValue(0.0);
fade1.setToValue(1.0);
fade1.setAutoReverse(false);
fade1.setCycleCount(1);
fade2.setOnFinished(e -> indicator.setOpacity(1.0));
FadeTransition fade2 = new FadeTransition(Duration.millis(250), indicator);
fade2.setFromValue(1.0);
fade2.setToValue(0.0);
fade2.setAutoReverse(false);
fade2.setCycleCount(1);
fade2.setOnFinished(e -> indicator.setOpacity(0.0));
ParallelTransition pt = new ParallelTransition(fade1, fade2);
pt.play();
// Werte in From/ToValue und OnFinished anpassen, wenn du es wieder umdrehen willst
#edit: Code aus dem Gedächtnis geschrieben -> keine Garantie für absolute Korrektheit...
 
Hallo dzim,

ich bin ehrlich beeindruckt was hier im Forum abgeliefert wird - so was aus dem Gedächtnis - Chapeau!
Ich habe Deinen Code bei mir dann folgendermaßen im Controller implementiert:
Java:
FadeTransition fade1 = new FadeTransition(Duration.millis(400), labelErrorStatus);
    FadeTransition fade2 = new FadeTransition(Duration.millis(400), pi);
Java:
public void setFadeTransitionLabelErrorStatus(boolean error) {
        if (error) {
            fade1.setFromValue(0.0);
            fade1.setToValue(1.0);
            fade1.setAutoReverse(false);
            fade1.setCycleCount(1);
            fade1.setOnFinished(e -> labelErrorStatus.setOpacity(1.0));
            fade2.setFromValue(1.0);
            fade2.setToValue(0.0);
            fade2.setAutoReverse(false);
            fade2.setCycleCount(1);
            fade2.setOnFinished(e -> pi.setOpacity(0.0));
            ParallelTransition pt = new ParallelTransition(fade1, fade2);
            pt.play();
        } else {
            fade1.setFromValue(1.0);
            fade1.setToValue(0.0);
            fade1.setAutoReverse(false);
            fade1.setCycleCount(1);
            fade1.setOnFinished(e -> labelErrorStatus.setOpacity(0.0));
            fade2.setFromValue(0.0);
            fade2.setToValue(1.0);
            fade2.setAutoReverse(false);
            fade2.setCycleCount(1);
            fade2.setOnFinished(e -> pi.setOpacity(1.0));
            ParallelTransition pt = new ParallelTransition(fade1, fade2);
            pt.play();
        }
    }
Dann einfach den Aufruf wenn ein Fehler passiert oder aber ich erneut einen Task starte:
Java:
labelErrorStatus.setText("Error in Task!");
setFadeTransitionLabelErrorStatus(true);
Danke für Deine Antwort!
Gruß
Ralf
 
Schaut ok aus. Die mehrfache Angabe von fadeX.setAutoReverse(false); fadeX.setCycleCount(1); könnte man noch rausziehen und sich sparen (auch das ParallelTransition pt = new ParallelTransition(fade1, fade2); pt.play();). Aber das ist nur ein Detail.

BTW: Was den "aus dem Gedächtnis"-Teil angeht: Wenn du lang genug mit der API schaffst, hast du dir wichtigsten Teile irgendwann im Kopf - musst höchstens bei Details nachschlagen. Ich arbeite mit JavaFX seit etwa 7 Jahren... (Manchmal nur aus Spass, aber auch beruflich einige Desktop- und Mobile-Apps.)
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben