web-dev-qa-db-fra.com

Comment lier le redimensionnement de la scène au redimensionnement des composants?

J'ai une application JavaFX 2.0 avec FXML. Je souhaite que les composants (TextFields, ComboBoxes, mises en page, etc.) soient redimensionnés lorsqu'une fenêtre avec une application est redimensionnée. Alors...

  • 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 création d'applications GUI avec JavaFX, vous remarquerez que certaines classes de l'API implémentent déjà des propriétés. Par exemple, la classe javafx.scene.shape.Rectangle Contient des propriétés pour arcHeight, arcWidth, height, width, x et y. Pour chacune de ces propriétés, il y aura des méthodes correspondantes qui correspondent aux conventions décrites précédemment. Par exemple, getArcHeight(), setArcHeight(double), arcHeightProperty(), qui ensemble indiquent (aux développeurs et aux outils) que la propriété donnée existe. *

  • Pour ajouter un auditeur à une scène, je dois 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 une liaison, je dois obtenir ma scène dans la classe contrôleur. Alors - comment puis-je obtenir une scène dans une classe de contrôleur?
  • Il semble que les contrôles d'interface utilisateur n'ont pas de propriétés width\height, pour être liés à quelque chose. Ou peut-être que je ne les ai pas trouvés.

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

[~ # ~] upd [~ # ~]. À propos de Scene Builder à Sergey Grinev: Lorsque j'utilise Ctrl + K sur mon composant (dites-lui d'occuper toute la zone de son composant parent) - tout va bien.

Mais que faire si je veux dire à mon composant d'occuper 50% d'une zone? Par exemple, j'ai un onglet avec deux VBox dessus. La largeur de l'onglet est 100px . Les largeurs de la Vbox sont 50px pour chacune. VBox1 a x1 = 0 , et x2 = 50 , et VBox2 a x1 = 50 , et x2 = 100 . Ensuite, je redimensionne ma fenêtre avec l'application JavaFX. Maintenant, j'ai la largeur de l'onglet = 200px . Mais mes largeurs de VBox sont toujours = 50px : VBox1 a x1 = 0 , et x2 = 50 , et VBox2 a x1 = 150 , et x2 = 200 . Et j'ai besoin qu'ils soient VBox1 x1 = 0 et x2 = 100 et VBox2 x1 = 100 et x2 = 200 . Où les valeurs x1 et x2 sont les coordonnées des coins des VBoxes.

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

17
Agafonova Victoria

Une autre option simple consiste à utiliser JavaFX Scene Builder (récemment devenu disponible en version bêta publique: http://www.Oracle.com/technetwork/Java/javafx/tools/index.html )

Il permet de créer une interface utilisateur par glisser-déposer et d'ancrer des éléments d'interface utilisateur aux bordures (par outil d'ancrage ), afin qu'ils se déplacent/redimensionnent avec les bordures de la fenêtre.

METTRE À JOUR:

Pour obtenir un pourcentage de redimensionnement automatique, vous pouvez utiliser GridPane avec ColumnConstraint:

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
Sergey Grinev

Quelques suggestions pour construire des guis redimensionnables =>

  • Assurez-vous que la racine de votre application est une sous-classe de volet, plutôt qu'un groupe.
  • Débloquez la taille maximale des boutons (par exemple, button.setMaxSize (Double.MAX_VALUE, Double.MAX_VALUE).
  • La plupart du temps, les volets de mise en page peuvent gérer le redimensionnement pour vous et vous n'avez pas besoin de liaisons et d'écouteurs => c'est-à-dire que vous ne liez que lorsque vous en avez vraiment besoin.
  • Les contrôles d'interface utilisateur et les volets de disposition sont des régions => toutes les régions ont des propriétés de hauteur et de largeur en lecture seule que vous pouvez écouter et auxquelles vous pouvez vous lier.
  • Vous ne pouvez pas lier directement les propriétés de hauteur et de largeur d'un contrôle à une autre valeur. Utilisez plutôt les propriétés minWidth/Height, prefWidth/Height, maxWidth/Height.
  • La scène a des propriétés de hauteur et de largeur auxquelles vous pouvez vous lier si nécessaire. Si vous faites cela, lorsque la scène est redimensionnée, la scène sera redimensionnée, puis vos composants liés seront redimensionnés. Si la racine de votre scène est un volet de disposition plutôt qu'un groupe, cette liaison est généralement inutile.
  • Si vous ne définissez pas de hauteur et de largeur sur la scène, pour une application autonome, la scène (et la scène) seront dimensionnées pour s'adapter à la taille préférée du nœud racine de la scène (qui est généralement ce que vous voulez).
  • Si tout le reste échoue, vous pouvez commencer à remplacer la méthode layoutchildren de Parent.

Voici n exemple d'une interface utilisateur JavaFX redimensionnable qui implémente certains des principes ci-dessus.

20
jewelsea

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 accédez-y dans toutes les classes de contrôleur.
  2. Vous pouvez placer tous les contrôles/composants dans une disposition/volet qui gère automatiquement sa disposition enfant. Pour différentes mises en page, consultez le doc api. Ensuite, liez les propriétés de largeur et de hauteur de la scène de scène aux propriétés de cette disposition en conséquence. Pour en savoir plus sur la liaison, consultez tilisation des propriétés et de la liaison JavaFX .
    Exemple de liaison unidirectionnelle
3
Uluk Biy