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...
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 pourarcHeight
,arcWidth
,height
,width
,x
ety
. 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:
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?
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();
}
Quelques suggestions pour construire des guis redimensionnables =>
Voici n exemple d'une interface utilisateur JavaFX redimensionnable qui implémente certains des principes ci-dessus.
Suggestions: