Comment lier stade de redimensionnement avec le redimensionnement des composants?

J'ai une application JavaFX 2.0 avec FXML. Je veux que les composants (TextFields, ComboBoxes, layouts, etc.) soient redimensionnés lorsqu'une fenêtre avec une application est redimensionnée. Si...

  • Comme il est écrit sur documentation Oracle pour JavaFX, pour faire quelque chose comme ça avec des formes, il y a quelques propriétés spéciales aux formes:

lors de la construction D'applications GUI avec JavaFX, vous remarquerez que certaines classes L'API implémente déjà les propriétés. Par exemple, le javafx.scene.shape.Rectangle classe contient les propriétés de arcHeight, arcWidth,height,width,x et y. Pour chacune de ces propriétés, il y aura méthodes correspondantes qui correspondent aux conventions décrites précédemment. Par exemple, getArcHeight(),setArcHeight(double),arcHeightProperty(), qui ensemble indiquent (à la fois aux développeurs et aux outils) que la propriété donnée existe.*

  • ajout d'un écouteur à un stade que j'ai à faire quelque chose comme:

       stage.resizableProperty().addListener(new ChangeListener<Boolean>(){
        @Override
        public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2){
            throw new UnsupportedOperationException("Not supported yet.");
        }
    
    });
    

il y a Donc deux questions:

  • pour faire un peu de reliure je dois obtenir mon stage dans la classe controller. Alors-comment puis-je obtenir une étape dans une classe de contrôleur?
  • on dirait que les commandes UI n'ont pas de propriétés widthheight, pour être liées à quelque chose. Ou peut-être que je ne les ai pas trouvés.

alors, comment puis-je résoudre mon problème?

UPD. Sur le constructeur de scène à Sergey Grinev: quand j'utilise Ctrl+K sur mon composant (dites - lui d'occuper toute la zone de son composant parent) - tout va bien.

Mais si je veux raconter mon composant d'occuper 50% d'une zone? Par exemple, j'ai un onglet avec deux VBOX dessus. L'onglet de la largeur 100px. Les largeurs de la Vbox sont 50px pour chaque. VBox1 a x1=0 et x2=50, et VBox2 a x1=50 et x2=100. Puis je redimensionne ma fenêtre avec L'application JavaFX. Maintenant, j'ai l'onglet Largeur = 200px. Mais mes largeurs de VBOX sont encore = 50px: VBox1 a x1=0 et x2=50, et VBox2 a x1=150 et x2=200. Et j'en ai besoin pour être VBox1 x1=0 et x2=100 et VBox2 x1=100 et x2=200. Où les valeurs de x1 et x2 sont les coordonnées des coins des boîtes.

comment Scene Builder peut-il m'aider dans cette situation?

16
demandé sur Community 2012-04-25 19:07:45

3 réponses

une autre option facile est D'utiliser JavaFX Scene Builder (récemment devenu disponible en bêta publique:http://www.oracle.com/technetwork/java/javafx/tools/index.html)

il permet de créer L'UI par glisser-déposer et ancrer les éléments de L'UI aux bordures (par outil d'ancrage), donc ils se déplacent/redimensionnent avec les bordures de fenêtre.

mise à jour:

vous pouvez utiliser GridPaneColumnConstraint:

public void start(Stage stage) {

    VBox box1 = new VBox(1);
    VBox box2 = new VBox(1);

    //random content
    RectangleBuilder builder = RectangleBuilder.create().width(20).height(20);
    box1.getChildren().addAll(builder.build(), builder.build(), builder.build());
    builder.fill(Color.RED);
    box2.getChildren().addAll(builder.build(), builder.build(), builder.build());

    //half by half screen
    GridPane grid = new GridPane();
    grid.addRow(0, box1, box2);

    ColumnConstraints halfConstraint = ColumnConstraintsBuilder.create().percentWidth(50).build();
    grid.getColumnConstraints().addAll(halfConstraint, halfConstraint);

    stage.setScene(new Scene(grid, 300, 250));
    stage.show();
}
7
répondu Sergey Grinev 2012-10-12 12:56:12

Quelques suggestions pour la construction de redimensionner les interfaces graphiques =>

  • assurez-vous que la racine de votre application est une sous-classe de Pane, plutôt qu'un groupe.
  • désactiver la taille maximale des boutons (E. bouton G.setMaxSize (Double.MAX_VALUE, Double.MAX_VALUE).
  • la plupart du temps, les vitres de mise en page peuvent gérer le redimensionnement pour vous et vous n'avez pas besoin de bindings et listeners => c'est-à-dire seulement bind quand vous en avez vraiment besoin.
  • les contrôles D'UI et les vitres de mise en page sont des régions = > tous Les régions ont des propriétés de hauteur et de largeur en lecture seule que vous pouvez écouter et lier.
  • vous ne pouvez pas lier directement les propriétés hauteur et largeur d'un contrôle à une autre valeur. Au lieu d'utiliser l'minWidth/Hauteur, prefWidth/Hauteur, maxWidth/propriétés de Hauteur.
  • la scène possède des propriétés de hauteur et de largeur auxquelles vous pouvez vous attacher si nécessaire. Si vous faites cela, lorsque la scène est redimensionnée, la scène sera redimensionnée, alors vos composants liés seront redimensionnés. Si la racine de votre scène est un volet disposition plutôt que d'un groupe, cette liaison est généralement inutile.
  • si vous ne définissez pas une hauteur et une largeur sur la scène, pour une application autonome, la scène (et la scène) sera dimensionnée pour correspondre à la taille préférée du noeud racine de la scène (ce qui est habituellement ce que vous voulez).
  • si tout le reste échoue, vous pouvez commencer à outrepasser la méthode layoutchildren du Parent.

Ici un exemple D'une interface utilisateur JavaFX resizable qui implémente certains des principes surtout.

20
répondu jewelsea 2012-04-25 19:40:16

Suggestions:

  1. si vous n'avez qu'une seule étape principale, stockez-la dans un champ/variable statique pendant que l'application démarre et y accède dans toutes les classes de controller.
  2. vous pouvez mettre tous les contrôles / composants dans un layout/pane qui gère la mise en page de ses enfants automatiquement. Pour différentes mises en page, consultez l'api doc. Après cela, liez les propriétés largeur et hauteur de la scène aux propriétés de cette disposition en conséquence. Plus sur la liaison regardez En Utilisant JavaFX Propriétés et reliure.

    Exemple unidirectionnel de liaison
3
répondu Uluk Biy 2017-05-23 10:30:09