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
4
A
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.
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. –
double possible de [secousses étape dans JavaFX] (http://stackoverflow.com/questions/16634960/shaking-stage-in-javafx) – jewelsea
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