Explicitement le positionnement des nœuds en JavaFX
Quand j'ai cliqué sur un bouton, elle change de position.
Mais quand je bouge la souris, le bouton est de nouveau au centre de la scène, pourquoi?
J'ai le code suivant:
public class HolaMundo extends Application {
Button btn;
Scene scene;
@Override
public void start(Stage primaryStage) {
btn = new Button();
btn.setText("Hola Mundo");
StackPane root = new StackPane();
root.getChildren().add(btn);
scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
scene.setOnMouseMoved(new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent t) {
btn.setText(String.valueOf(t.getX() ));
}
});
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
btn.setLayoutX(Math.random() * (300 - btn.getWidth()));
btn.setLayoutY(Math.random() * (250 - btn.getHeight()));
}
});
}
public static void main(String[] args) {
launch(args);
}
}
- Quelle est la version de JavaFX êtes-vous? Avec JavaFX 8 le bouton ne bouge pas du tout.
Vous devez vous connecter pour publier un commentaire.
Approche suggérée
De votre extrait de code, peut-être l'aide d'un Volet au lieu d'un StackPane est la meilleure approche.
Pourquoi ton code ne fait pas ce que vous voulez
Si vous envisagez de définir manuellement les valeurs de mise en forme, ne pas utiliser un modèle de volet (comme un StackPane) qui définit automatiquement les valeurs de mise en forme pour vous. Si vous utilisez une mise en page volet, puis la mise en page des valeurs que vous définissez explicitement sera remplacée automatiquement à la prochaine mise volet effectue une passe de mise en page (par exemple, elle est redimensionnée ou partie de ses contenus ou de l'emplacement dans le graphe de scène est sale).
Options pour explicitement à la pose des nœuds
Si vous voulez explicitement des éléments de mise en JavaFX, effectuez l'une des opérations suivantes:
Des conseils portant sur le nœud de positionnement
Si vous voulez être automatiquement mis hors de composants à l'aide du modèle prédéfini gestionnaires, mais que vous souhaitez ajuster ou de modifier temporairement les emplacements de certains des composants à partir de leurs positions par défaut, vous pouvez ajuster la translateX/A valeurs plutôt que de layoutX/A valeurs. Selon la définition de translateX:
Cela signifie que le gestionnaire de configuration peuvent calculer un enfant dans la position par défaut à l'aide de
layoutX
, et vous pouvez ajuster la position de la valeur par défaut à l'aide detranslateX
.De ne pas avoir profondément étudié le cas actuel, je vois une différence quand j'utilise un AnchorPane au lieu de la StackPane de placer le Bouton sur.
En modifiant le texte de l'étiquette du Bouton par la mouseMoved-Événement le Volet est rendu (mise en page est requise). Avec un StackPane de placement de tous les enfants dans le centre de lui-même la position du Bouton de réinitialisation pour le centre du Panneau. Quand vous regardez dans le layoutChildren méthode de StackPane vous verrez un appel à resizeRelocate. Donc layoutX et layoutY sont reset et le bouton se déplace vers l'arrière à la position centrale (ou ce que vous définissez l'alignement de la StackPane d').
Donc je pense que c'est un comportement correct de la StackPane et je recommande d'utiliser un autre Volet, par exemple, AnchorPane.