Layout 我可以强制JavaFX';是否使用网格窗格均匀分布空间?
在JavaFX2中使用GirdPanes时,我遇到了一些奇怪的布局行为。虽然它通常似乎在多个字段之间均匀地分布水平空间,但在其他一些情况下却不这样做。下面是一个显示效果的示例:Layout 我可以强制JavaFX';是否使用网格窗格均匀分布空间?,layout,javafx-2,gridpanel,Layout,Javafx 2,Gridpanel,在JavaFX2中使用GirdPanes时,我遇到了一些奇怪的布局行为。虽然它通常似乎在多个字段之间均匀地分布水平空间,但在其他一些情况下却不这样做。下面是一个显示效果的示例: import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Control; import javafx.scene.control
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class TestDialog extends Stage {
public TestDialog() {
super();
setTitle("Test");
GridPane grid = new GridPane();
grid.setHgap(5);
grid.setVgap(5);
grid.setPadding(new Insets(10, 10, 10, 10));
final TextField tField1 = new TextField();
final TextField tField2 = new TextField();
tField2.setMaxWidth(200);
grid.add(createLabel("Field 1:"), 0, 0);
grid.add(tField1, 1, 0);
grid.add(createLabel("Field 2:"), 2, 0);
grid.add(tField2, 3, 0);
Pane pane = new Pane();
// pane.setMinSize(600, 100); // first row has weird layout behaviour
pane.setMinSize(100, 100); // first row is fine
pane.setStyle("-fx-background-color: black");
grid.add(pane, 0, 1, 4, 1);
grid.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);
setScene(new Scene(grid));
}
private Label createLabel(String text) {
Label label = new Label(text);
label.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);
return label;
}
public static void main(String[] args) {
TestApplication.main(args);
}
public static class TestApplication extends Application {
@Override
public void start(Stage stage) throws Exception {
TestDialog dialog = new TestDialog();
dialog.showAndWait();
}
public static void main(String[] args) {
launch(args);
}
}
}
在本例中,如果按原样运行,对话框将很好地调整大小。如果将额外窗格的最小大小更改为注释中的版本,则会出现问题:第一行中的额外空间将变为空白(而不是增加第一个字段),减小对话框大小会将其从已经很小的第一个字段中移除,空区保持不变
有没有办法让GridPane实际使用第一个字段的可用水平空间?我知道,将对话框大小减小到所需的最小值以下并不一定会产生好的结果,但不首先扩展字段对我来说显然是错误的
我从JDK1.7.0_21开始使用JavaFX。您必须查看ColumnConstraints和RowConstraints类。这些将告诉网格窗格如何分配空间。不幸的是,API在这里有点笨拙。如果要均匀分布未知数量的空间,必须首先实例化约束,然后使用#setPercentageWidth-此选项在构造函数中不可用 总而言之,具有3个均匀分布列的GridPane(如果可能,同时考虑最小大小)将如下所示:
public class Test extends Application {
public void start(final Stage stage) throws Exception {
final GridPane grid = new GridPane();
grid.getColumnConstraints().setAll(
ColumnConstraintsBuilder.create().percentWidth(100/3.0).build(),
ColumnConstraintsBuilder.create().percentWidth(100/3.0).build(),
ColumnConstraintsBuilder.create().percentWidth(100/3.0).build()
);
grid.add(new Button("One"),0,0);
grid.add(new Button("Two"),1,0);
grid.add(new Button("and three"),2,0);
stage.setScene(new Scene(grid));
stage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
您可以相应地处理行约束。您可能还希望在单元格中设置对齐方式,以确保对话框在调整大小时仍保持良好的外观 我知道这些限制,但到目前为止,我的实验都产生了有趣但不是很有用的结果。在最小尺寸的情况下,宽度的计算似乎完全被打破了——如果所有列的宽度都设置为25%,窗口就会变得很大。我现在已经转到MiG布局。
ColumnStraintsBuilder
不推荐使用。请参见列约束
。