JavaFX Timeline KeyFrame Reihenfolge

hk

Bekanntes Mitglied
Hallo Forum,
Ich habe eine Timeline welche einen Text anzeigt und langsam ausblendet (das funktioniert). Dann sollen die Elemente unsichtbar gemacht werden, da gibt es dann Probleme:
Gebe ich in kf_2 Duration 0 an werden die Elemente nicht unsichtbar,
Gebe ich in kf_2 Duration 0.1 an erfolgt auch die Textanzeige nur über 0.1 Sekunden.
Hier der Code:
Java:
protected static void showShortMsg(String txt) {
    shortMsg.setText(txt);
    KeyValue fade_1 = new KeyValue(shortMsg.opacityProperty(), 1.0);
    KeyValue fade_2 = new KeyValue(shortMsg.opacityProperty(), 0.0);
    KeyFrame kf_1 = new KeyFrame(Duration.seconds(2), fade_1, fade_2);
    KeyValue visi_1 = new KeyValue(shortMsg.visibleProperty(), false);
    KeyValue visi_2 = new KeyValue(hBox.visibleProperty(), false);
    KeyFrame kf_2 = new KeyFrame(Duration.seconds(0.1), visi_1, visi_2);
    Timeline tm = new Timeline();
    tm.getKeyFrames().addAll(kf_1, kf_2);
    shortMsg.setVisible(true);
    hBox.setVisible(true);
    tm.play();
  }
lg heinz
 
Hallo Forum,
Ich habe eine Timeline welche einen Text anzeigt und langsam ausblendet (das funktioniert). Dann sollen die Elemente unsichtbar gemacht werden, da gibt es dann Probleme:
Gebe ich in kf_2 Duration 0 an werden die Elemente nicht unsichtbar,
Gebe ich in kf_2 Duration 0.1 an erfolgt auch die Textanzeige nur über 0.1 Sekunden.
Hier der Code:
Java:
protected static void showShortMsg(String txt) {
    shortMsg.setText(txt);
    KeyValue fade_1 = new KeyValue(shortMsg.opacityProperty(), 1.0);
    KeyValue fade_2 = new KeyValue(shortMsg.opacityProperty(), 0.0);
    KeyFrame kf_1 = new KeyFrame(Duration.seconds(2), fade_1, fade_2);
    KeyValue visi_1 = new KeyValue(shortMsg.visibleProperty(), false);
    KeyValue visi_2 = new KeyValue(hBox.visibleProperty(), false);
    KeyFrame kf_2 = new KeyFrame(Duration.seconds(0.1), visi_1, visi_2);
    Timeline tm = new Timeline();
    tm.getKeyFrames().addAll(kf_1, kf_2);
    shortMsg.setVisible(true);
    hBox.setVisible(true);
    tm.play();
  }
lg heinz
Ich habe nun alle KeyValue in einen KeyFrame gesteckt. Das funktioniert nun, aber nur einmal. Bei jeden weiteren Versuch passiert nichts. Der Code wird ohne Wirkung abgearbeitet. Das ist noch seltsamer.
 
Die Antwort lautet vermutlich: playFromStart() oder replay oder reset vor dem Start. "Play" führt die Timeline von dem Frame aus fort, wo sie stehen geblieben ist. Du bist am Ende angekommen und drückst play - bleibst also am Ende stehen.
 
Die Antwort lautet vermutlich: playFromStart() oder replay oder reset vor dem Start. "Play" führt die Timeline von dem Frame aus fort, wo sie stehen geblieben ist. Du bist am Ende angekommen und drückst play - bleibst also am Ende stehen.
Ja, das hat geholfen. Der Aufruf kann nun wiederholt werden. Aber der Effekt ist nun, dass der Text nicht mehr verblasst sondern bis zum Ende unverändert bleibt.
Ich sende daher nochmals den aktuellen Code:
Java:
// Die HBox und die darin befindliche Text-Node werden
  // sichtbar gemacht.
  // Die Text-Node wird nun angezeigt und soll in 3 Sekunden
  // verblassen.
  // Dann soll die HBox und die Text-Node wieder unsichtbar
  // gemacht werden.
  protected static void showShortMsg(String txt) {
    shortMsg.setText(txt);
    shortMsg.setVisible(true);
    hBox.setVisible(true);
    KeyValue fade_1 = new KeyValue(shortMsg.opacityProperty(), 1.0);
    KeyValue fade_2 = new KeyValue(shortMsg.opacityProperty(), 0.0);
    KeyValue visi_1 = new KeyValue(shortMsg.visibleProperty(), false);
    KeyValue visi_2 = new KeyValue(hBox.visibleProperty(), false);
    KeyFrame kf_1 = new KeyFrame(Duration.seconds(3), fade_1, fade_2);
    KeyFrame kf_2 = new KeyFrame(Duration.seconds(3), visi_1, visi_2); // <-- Zeit unklar
    Timeline tm = new Timeline();
    tm.setCycleCount(1);
    tm.getKeyFrames().addAll(kf_1, kf_2);
    tm.playFromStart();
  }
 
Ich schaffe meist nur mit den vorbereiteten Transitionen. Selten mit Timelines. Dort halt FadeTransition (setzt opacity) und dann im onFinish-Handler halt visibility/managed aktivieren/deaktivieren.
 
So, die Probleme sind nun alle gelöst:
- Zum ersten ist es für einen weiteren Durchlauf notwendig den ursprünglichen Wert der zu animierenden Eigenschaft wiederherzustellen.
- Zum zweiten ist es wichtig auch den "setCycleCount()" jedenfalls anzugeben, dann funktionierts (jedenfalls bei mir).
Hier die finale Version:
Java:
protected static void showShortMsg(String txt) {
    shortMsg.setText(txt);
    shortMsg.setVisible(true);
    shortMsg.setOpacity(1.0);
    hBox.setVisible(true);
    KeyValue fade_1 = new KeyValue(shortMsg.opacityProperty(), 1.0);
    KeyValue fade_2 = new KeyValue(shortMsg.opacityProperty(), 0.0);
    KeyValue visi_1 = new KeyValue(shortMsg.visibleProperty(), false);
    KeyValue visi_2 = new KeyValue(hBox.visibleProperty(), false);
    KeyFrame kf_1 = new KeyFrame(Duration.seconds(3), fade_1, fade_2, visi_1, visi_2);
    Timeline tm = new Timeline();
    tm.getKeyFrames().addAll(kf_1);
    tm.setCycleCount(1);
    tm.playFromStart();
  } //end showShortMsg ------------------------------------
 

Zurück
Oben