2013-10-04 13 views
7

Ich benutze JavaFX in einem Projekt statt Swing wegen der erweiterten Multimedia, Webviewer und die Möglichkeit, visuelle Effekte zu verwenden. Doch was ich habe gelernt, von dem, was ich im Internet gefunden (http://docs.oracle.com/javafx/2/layout/jfxpub-layout.htm und andere) ist, dass JavaFX Layout-Manager Fokus auf die Größe der Mutter Skalierung basierend auf der Größe des Inhalts, während Swing- konzentriert sich auf Skalierung des Inhalts nach dem Stamm, zumindest basierend auf der Layout wird verwendet.JavaFX Layout skaliert mit Eltern

Im Moment verwende ich eine Accordion mit einigen TitledPane Kinder. Einer von ihnen enthält eine GridPane aus dem einfachen Grund, es ist der beste Weg, den ich kenne, um eine GridLayout zu emulieren (wie ich aus meiner vorherigen Frage hier gelernt: JavaFX layout equivalent to GridLayout). Ich möchte den Inhalt der TitledPane in 2 Zeilen und 1 Spalte aufgeteilt haben, jede Zeile mit einer 50% Höhe des verfügbaren Speicherplatzes in der TitledPane (Skalierung mit Stage oder Scene), was entspricht, was eine GridLayout(2,1) innerhalb einer BorderLayout.CENTER erreichen würde . Hierzu habe ich eine GridPane mit 2 RowConstraint s unter Verwendung setPercentHeight(50) und 1 ColumnConstraint mit setPercentWidth(100) hinzugefügt. Allerdings habe ich bemerkt, dass der Inhalt mit dem Gitter richtig skaliert wird, aber das Gitter nimmt nicht den gesamten verfügbaren Platz in der TitledPane auf (weil es sich scheinbar nicht wie ein BorderPane 's Zentrum verhält). Ich habe auch mit setMaxWidth versucht, den Inhalt mit dem Elternteil zu skalieren, aber es scheint auch nicht zu funktionieren (wie hier gesagt: JavaFX: How to make my custom component use all available space from parent layout?). Und selbst wenn, würde ich die maximale Breite zu JEDEM Nachkommen in meinem UI-Elementbaum setzen müssen, um alle von ihnen zu skalieren?

Woher weiß jemand, wie man eine TitledPane mit 2 gleichen Leerzeichen unter einander, die mit der tiledpanes Größe skalieren?

column width does not take up all available space

Antwort

9

In der Tat, Ihre gridpane wächst seine alle Eltern zu füllen. Betrachten Sie den folgenden Code, ich habe eine Hintergrundfarbe (rot) zu Debugging-Zwecken zu der Gridpane hinzugefügt.

Accordion accordion = new Accordion(); 
TitledPane titledPane = new TitledPane(); 
titledPane.setText("Title"); 
GridPane gridPane = new GridPane(); 
gridPane.setStyle("-fx-background-color:red"); 

gridPane.add(new TextArea("Hello"), 0, 0); 
gridPane.add(new TextArea("World"), 0, 1); 

titledPane.setContent(gridPane); 
accordion.getPanes().add(titledPane); 

Wenn Sie diesen Code ausführen, wird die gridpane alle seine Eltern füllen (überprüfen die rote Farbe der ganzen titledpane Inhalt erstreckt).

Der Inhalt der Gridpane füllt jedoch nicht die gesamte Spalte. Wenn Sie versuchen, die Größe des Fensters zu ändern, werden Sie feststellen, dass sich die Breite der Textfelder nicht mit der Größe der Rasterfläche ändert. Um das zu beheben, müssen Sie der ersten Spalte der Gridpane mitteilen, dass sie mit der Gridpane selbst wachsen soll. Die Art und Weise zu tun, ist die folgende Einschränkung hinzuzufügen:

ColumnConstraints columnConstraints = new ColumnConstraints(); 
columnConstraints.setFillWidth(true); 
columnConstraints.setHgrow(Priority.ALWAYS); 
gridPane.getColumnConstraints().add(columnConstraints); 
+0

Können Sie mir sagen, was der Unterschied zwischen setPercentWidth (100) und setFillWidth (true) + setHgrow (Priority.ALWAYS)? – Warkst

+1

setPercentWidth würde auch anstelle von setHGrow (Priority.ALWAYS) funktionieren. Sie werden beide dasselbe tun, wenn Sie nur eine Spalte verwenden. Wenn Sie mehrere Spalten haben, würden sie anders funktionieren. Weil setHGrow versucht, dem Layout mitzuteilen, welche Spalte der Gridpanel wachsen muss, um den nicht beanspruchten verfügbaren Platz zu füllen. – Rasha

+1

setFillWidth (true) bezieht sich auf den Inhalt der Spalte, nicht auf die Spalte selbst. Der Standardwert ist wahr, denke ich. Sie müssen es also nicht einstellen. Was es bedeutet, ist, ob die Kinder der Spalte angepasst werden, um die gesamte Breite der Spalte zu füllen. – Rasha