JavaFX FadeTransition, warten bis beendet

MarkusM

Aktives Mitglied
Hallo zusammen,

ich habe mal eine kurze Frage zum Thema "FadeTransition". Und zwar möchte ich gerne ein Pane ausblenden, ein neues Pane laden und dieses dann einblenden.

Ich habe allerdings das Problem, dass das Ausblenden noch läuft, während der Rest abgearbeitet wird.

Java:
    public void loadAnchorPane(AnchorPane ap){
        try {
            JavaFXEffects.fadeOut(ap);
            AnchorPane p = FXMLLoader.load(getClass().getResource("/sample/pane.fxml"));
            ap.getChildren().setAll(p);
            JavaFXEffects.fadeIn(ap);
        } catch (IOException e) {
        }
    }

Java:
public class JavaFXEffects {
    public static void fadeIn(Node node) {
        FadeTransition ft = new FadeTransition(Duration.millis(5000), node);
        ft.setFromValue(0.0);
        ft.setToValue(1.0);
        ft.play();
    }

    public static void fadeOut(Node node) {
        FadeTransition ft = new FadeTransition(Duration.millis(5000), node);
        ft.setFromValue(1.0);
        ft.setToValue(0.0);
        ft.play();
    }
}
 

Jardcore

Top Contributor
Du kannst eine Property benutzten, welche du durch eine schnöde Timeline von 0 - 1 und dann wieder von 1 - 0 laufen lässt. Beide als eigenes KeyFrame.
Java:
//...
DoubleProperty opacity = new SimpleDoubleProperty(0);
node.opacityProperty.bind(opacity);
int timestep = 5000;
///...
Timeline timeline = new Timeline(
new KeyFrame(Duration.millis(timestep), new KeyValue(opacity,1)),
new KeyFrame(Duration.millis(timestep * 2), new KeyValue(opacity,0)));
timeline.play();
 

dzim

Top Contributor
Bei mir im Code gibt es die opacityProperty() ebenfalls.
Du kannst übrigens auch mit ParellelTransitions oder SequentialTransition mehrere Transitions ausführen lassen... Hab ich jedenfalls so gemacht.
 

MarkusM

Aktives Mitglied
Sorry, ich hatte dicke Finger... :confused:

Mein Problem bleibt aber trotzdem bestehen. Das Ausblenden wird irgendwie "übersprungen".

Ich hätte gern folgenden Ablauf:

AnchorPane ausblenden
neues AnchorPane setzen
AnchorPane einblenden
 

MarkusM

Aktives Mitglied
@dizm: Hast Du vielleicht mal ein Codebeispiel dafür, wie ich den "AnchorPane" setzen vernünftig zwischendie Transition bekomme?
 

dzim

Top Contributor
Nö. Weil ich keine AnchorPanes verwende. Aber dafür ein StackPane, auf das ich alles drauf tu:

Java:
    private void toggleCenter(final Pane pane) {
        if (currentActiveNode != null) {
            currentActiveNode.setDisable(true);
            FadeTransition ft = new FadeTransition(Duration.millis(125), currentActiveNode);
            ft.setAutoReverse(false);
            ft.setFromValue(1.0);
            ft.setToValue(0.0);
            ft.setOnFinished(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    stackPaneContainer.getChildren().remove(currentActiveNode);
                    setCenter(pane);
                }
            });
            ft.play();
        } else {
            setCenter(pane);
        }
    }

    private void setCenter(final Pane pane) {
        if (pane != null && !stackPaneContainer.getChildren().contains(pane)) {
            stackPaneContainer.getChildren().add(pane);
            currentActiveNode = pane;
            currentActiveNode.setDisable(true);
            FadeTransition ft = new FadeTransition(Duration.millis(125), currentActiveNode);
            ft.setAutoReverse(false);
            ft.setFromValue(0.0);
            ft.setToValue(1.0);
            ft.setOnFinished(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    currentActiveNode.setDisable(false);
                }
            });
            ft.play();
        }
    }

Nicht unbedingt elegant, würde es heute vielleicht anders machen, aber es funktioniert recht zuverlässig und mit #toggleCenter(Pane) wird immer der Node nach vorne geholt und sichtbar gemacht, den ich sehen möchte.
 

Jardcore

Top Contributor
Du kannst auch mit setOnFinished() auf das Beenden der vorherigen Transition reagieren. Dort kannst du das Pane wechseln und anschließend eine neue Transition starten.

Edit: da hatte jemand eine ähnliche Idee, schneller :)
Es geht auch mit lambda und dann ein wenig kürzer
Java:
setOnFinished(e -> {
    // do something
});
 

MarkusM

Aktives Mitglied
Lieben Dank,

ich habe das Ganze jetzt wie folgt gelöst:

Java:
    public void loadAnchorPane(final Pane ap, final String newFxmlName, final String oldFxmlName) {
        if (!newFxmlName.equals(oldFxmlName)) {
            final double duration = 200;
            FadeTransition ft = new FadeTransition(Duration.millis(duration), ap);
            ft.setFromValue(1.0);
            ft.setToValue(0.0);
            ft.setOnFinished(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    try {
                        AnchorPane p = FXMLLoader.load(getClass().getResource("/sample/" + newFxmlName));
                        ap.getChildren().setAll(p);
                        FadeTransition ft = new FadeTransition(Duration.millis(duration), ap);
                        ft.setFromValue(0.0);
                        ft.setToValue(1.0);
                        ft.play();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
            ft.play();
        }
    }
 

dzim

Top Contributor
Ja, ich würde auch Lamdas - oder gar Methoden-Referenzen - präferieren, aber leider muss der gezeigte Code nosch auf Java7 lauffähig sein... :confused:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I JavaFX FadeTransition: setOnFinished bei Infinite Loops AWT, Swing, JavaFX & SWT 0
izoards JavaFX Background Task warten auf Knopfdruck AWT, Swing, JavaFX & SWT 4
G FX warten bis ein anderes GUI Element ausgewählt wurde AWT, Swing, JavaFX & SWT 8
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
kodela Swing Anzeige des Warten-Cursors AWT, Swing, JavaFX & SWT 8
H Eigener Dialog mit Rückgabe -> Warten auf Button AWT, Swing, JavaFX & SWT 3
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
W JavaFX Webview warten bis Seite geladen geladen ? AWT, Swing, JavaFX & SWT 0
U Java FX Warten auf Textfield eingabe AWT, Swing, JavaFX & SWT 17
O Swing JDialog öffnen und dann warten bis er geschlossen wurde AWT, Swing, JavaFX & SWT 2
H Event Handling JavaFx - auf Event warten AWT, Swing, JavaFX & SWT 4
Thallius Auf Swingworker warten? AWT, Swing, JavaFX & SWT 5
D Swing Bei MenuSelectionManager auf Ausführung warten? AWT, Swing, JavaFX & SWT 5
gamebreiti auf usereingabe warten mit GUI(nur Labels, Buttons etc. keine Texteingaben) AWT, Swing, JavaFX & SWT 3
P Warten auf komponente AWT, Swing, JavaFX & SWT 2
H AWT Auf Bestätigung warten AWT, Swing, JavaFX & SWT 6
B Timer, TimerTask und Warten AWT, Swing, JavaFX & SWT 4
L JavaFX Wait/Sleep/postedDelay - Einfach nur warten AWT, Swing, JavaFX & SWT 4
C Swing SwingWorker: Auf beendigung eines Formulars / einer Arbeit warten AWT, Swing, JavaFX & SWT 10
F JFrame nach Buttonklick 3 Sekunden warten, bevor es sich ändert AWT, Swing, JavaFX & SWT 2
C Schleife auf Mausklick warten lassen AWT, Swing, JavaFX & SWT 6
A Auf Tastendruck warten AWT, Swing, JavaFX & SWT 9
A Auf eingabe warten AWT, Swing, JavaFX & SWT 5
S auf paintComponent() warten AWT, Swing, JavaFX & SWT 34
B Warten bis neues ImageIcon zugewiesen ist AWT, Swing, JavaFX & SWT 3
S Swing Bild (Gif) in Bitte warten JDialog AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
M Hauptprogramm pausieren und auf Ergebnis eines JDialogs warten AWT, Swing, JavaFX & SWT 7
I Swing Warten, bis eine GUI-Komponente aktualisiert ist? AWT, Swing, JavaFX & SWT 4
A Swing Warten bis JDialog fertig AWT, Swing, JavaFX & SWT 3
T Auf Ende von mehreren Threads warten, ohne den EDT zu blockieren AWT, Swing, JavaFX & SWT 1
pinerski Swing Frame 1 soll auf Frame 2 warten AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
R JDialog "Bitte warten..." durchsichtig AWT, Swing, JavaFX & SWT 5
G JTable warten bis Spalte verschoben wurde AWT, Swing, JavaFX & SWT 2
C Warten auf Rückgabewert im EventDispatchingThread AWT, Swing, JavaFX & SWT 8
A Bitte warten Dialog AWT, Swing, JavaFX & SWT 4
G Auf Ergebnis vom Thread warten AWT, Swing, JavaFX & SWT 3
O Zwei Listener auf Komponente, warten auf Beendigun? AWT, Swing, JavaFX & SWT 2
R Warten auf Ergebnisse eines untergeordneten JFrame AWT, Swing, JavaFX & SWT 2
C Auf Ereignis warten AWT, Swing, JavaFX & SWT 7
L Warten, aber trotzdem "lebende" UI AWT, Swing, JavaFX & SWT 2
K Textfeld Programm soll auf Eingabe warten! AWT, Swing, JavaFX & SWT 4
B Auf Frame/Dialog warten AWT, Swing, JavaFX & SWT 2
A Programmunterbrechung und warten auf Benutzereingabe AWT, Swing, JavaFX & SWT 6
J Warten auf einen Dialog? AWT, Swing, JavaFX & SWT 2
J Programm warten, bis GUI geschlossen ist AWT, Swing, JavaFX & SWT 4
F Auf Thread warten ohne alles andere zu blockieren AWT, Swing, JavaFX & SWT 5
W Auf eine Eingabe warten? AWT, Swing, JavaFX & SWT 2
N malen => 1 Sekunde warten => malen AWT, Swing, JavaFX & SWT 2
m@nu Dialog während warten anzeigen AWT, Swing, JavaFX & SWT 3
U Auf Swings Reaktion warten AWT, Swing, JavaFX & SWT 3
C JFrame warten lassen AWT, Swing, JavaFX & SWT 11
GUI-Programmer Swing JWindow - Programm wird ohne Grund beendet AWT, Swing, JavaFX & SWT 3
B Swing JDialog : Herausfinden wie dieser beendet wurde? AWT, Swing, JavaFX & SWT 2
M wie beendet man ein applet? AWT, Swing, JavaFX & SWT 14
D Thread beendet sich nicht AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben