2017-09-01 2 views
0

Je cherche des façons de déplacer nodes (dans mon cas un TextField) ainsi que de les redimensionner.JavaFX - Redimensionner et/ou déplacer des nœuds (par exemple TextFields)

est Ci-dessous un exemple de base:

public class Main extends Application{ 

private static final Pane pane = new Pane(); 

public void start(Stage stage) { 
    TextField txtField = new TextField(); 
    txtField.relocate(300, 0); 
    Button btnS = new Button("Change size"); 
    btnS.setPrefSize(100, 20); 
    btnS.relocate(0, 0); 
    btnS.setOnAction(e -> { 
     ScaleTransition transition = new ScaleTransition(Duration.millis(300), txtField); 
     transition.setByX(2); 
     transition.play(); 
    }); 

    Button btnP = new Button("Change Position"); 
    btnP.setPrefSize(100, 20); 
    btnP.relocate(110, 0); 
    btnP.setOnAction(e -> { 
     PathTransition transition = new PathTransition(); 
     transition.setNode(txtField); 
     transition.setPath(new Path(new MoveTo(300, 50))); 
     transition.play(); 
    }); 

    pane.getChildren().addAll(btnS, btnP, txtField); 
    Scene scene = new Scene(pane); 
    pane.setPrefSize(500, 100); 
    stage.setScene(scene); 
    stage.show(); 
} 

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

Je veux TextField pour changer largeur uniquement d'une manière du côté droit (il ressemble à une manière « glissante » (devient plus large) de gauche à la droite). Je pense que ma tentative est fausse, puisque je ne veux pas l'échelle, mais redimensionner il (la mise à l'échelle de la TextField fonctionne bien). Ou est le seul moyen de changer la taille en créant une boucle, qui ajoute le montant i à la largeur pour chaque itération? L'autre Button doit déplacer le TextField. Cette fois, je pense que ma tentative est correcte, mais le code ne fonctionne pas, ce que je ne peux pas expliquer.

Quelqu'un pourrait m'aider ici? Je vous remercie.

Répondre

2

En ce qui concerne le changement de la largeur du TextField est concerné. Une boucle ne fonctionnera pas puisque vous bloquez le thread responsable de la mise en page avec elle. La façon dont vous pouvez redimensionner le noeud dépend du parent, car la largeur d'affichage est déterminée par le parent lors de la mise en page. Dans ce cas, vous pouvez simplement animer la propriété prefWidth en utilisant un Timeline:

Timeline timeline = new Timeline(
     new KeyFrame(Duration.ZERO, new KeyValue(txtField.prefWidthProperty(), txtField.getWidth())), 
     new KeyFrame(Duration.millis(300), new KeyValue(txtField.prefWidthProperty(), 300))); 

timeline.play(); 

L'autre bouton doit déplacer le TextField. Cette fois, je pense que ma tentative est correcte, mais le code ne fonctionne pas, ce que je ne peux pas expliquer.

Jetez un oeil à ce que le chemin que vous utilisez ressemble. Rien n'est dessiné, puisque vous n'utilisez qu'un seul élément MoveTo. Soit vous devez corriger le chemin ou nous le plus simple TranslateTransition:

TranslateTransition transition = new TranslateTransition(Duration.millis(400), txtField); 
transition.setToY(50); 
transition.play(); 

Note: Vous devrez peut-être modifier le code afin d'obtenir l'effet désiré pour les clics répétés.