2015-09-04 1 views
4

J'ai une fenêtre non-plein-écran non décorée, que j'aime déplacer hors des limites de l'écran lorsque la souris quitte sa zone, mais le faire en douceur. J'ai trouvé quelques fonctionnalités JavaFX pour ce faire - Timeline, mais KeyValue pour ce scénario ne supporte pas stage.xProperty - parce que cette propriété est readonlyProperty. Est-il possible de déplacer ma fenêtre en douceur en utilisant les fonctions JavaFX?JavaFX - déplacer la fenêtre avec effet

+0

double possible de [secousses étape dans JavaFX] (http://stackoverflow.com/questions/16634960/shaking-stage-in-javafx) – jewelsea

+0

En fait, bien que la technique en cause est un peu De même, les réponses actuelles à la question de l'étape ne sont pas très bonnes pour vos objectifs, car elles ne bougent pas facilement la scène. – jewelsea

Répondre

4

Vous pouvez configurer les propriétés de proxy que vous manipulez via KeyValues ​​dans un scénario. Un écouteur sur le proxy peut modifier l'emplacement réel de la scène.

window

import javafx.animation.*; 
import javafx.application.*; 
import javafx.beans.property.*; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 
import javafx.scene.text.TextAlignment; 
import javafx.stage.*; 
import javafx.util.Duration; 

public class StageSwiper extends Application { 

    private static final int W = 350; 
    private static final Duration DURATION = Duration.seconds(0.5); 

    @Override 
    public void start(Stage stage) throws Exception { 
     Label instructions = new Label(
      "Window will slide off-screen when the mouse exits it.\n" + 
        "Click the window to close the application." 
     ); 
     instructions.setTextAlignment(TextAlignment.CENTER); 

     final StackPane root = new StackPane(instructions); 
     root.setStyle("-fx-background-color: null;"); 

     DoubleProperty stageX = new SimpleDoubleProperty(); 
     stageX.addListener((observable, oldValue, newValue) -> { 
      if (newValue != null && newValue.doubleValue() != Double.NaN) { 
       stage.setX(newValue.doubleValue()); 
      } 
     }); 

     final Timeline slideLeft = new Timeline(
       new KeyFrame(
         DURATION, 
         new KeyValue(
           stageX, 
           -W, 
           Interpolator.EASE_BOTH 
         ) 
       ), 
       new KeyFrame(
         DURATION.multiply(2) 
       ) 
     ); 
     slideLeft.setOnFinished(event -> { 
      slideLeft.jumpTo(Duration.ZERO); 
      stage.centerOnScreen(); 
      stageX.setValue(stage.getX()); 
     }); 

     root.setOnMouseClicked(event -> Platform.exit()); 
     root.setOnMouseExited(event -> slideLeft.play()); 

     stage.setScene(new Scene(root, W, 100, Color.BURLYWOOD)); 
     stage.initStyle(StageStyle.UNDECORATED); 
     stage.show(); 

     stage.centerOnScreen(); 
     stageX.set(stage.getX()); 
    } 


    public static void main(String[] args) { 
     launch(args); 
    } 

} 
+0

merci, ça marche bien! Maintenant, je vais essayer d'intégrer cette solution à mon projet. –