ScrollPane 中的 JavaFX GridPane 比预期的要大
JavaFX GridPane in ScrollPane is bigger than expected
我在混javafx
的时候遇到了这样的事情:
我创建了一个 GridPane
,将其包裹在 ScrollPane
中并填充了 Buttons
,但事先将 RowConstraints
和 ColumnConstraints
更改为 GridPane
。
问题是水平滚动条看起来不合适。我相信它 GridPane
这么胖,但怎么会这样呢?
但是垂直滚动条非常好。
sample.fxml
<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="SampleController">
<children>
<ScrollPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<content>
<GridPane fx:id="gridPane" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
</GridPane>
</content>
</ScrollPane>
</children>
</AnchorPane>
sampleController.java
public class SampleController {
@FXML public GridPane gridPane;
@FXML
public void initialize(){
RowConstraints rowConstraints = new RowConstraints(10.0, 40, 40);
ColumnConstraints columnConstraints = new ColumnConstraints(10.0, 40, 40);
int i=0,j=0;
for(i=0; i<50; i++){
gridPane.getRowConstraints().add(i, rowConstraints);
for(j=0; j<30; j++) {
gridPane.getColumnConstraints().add(j, columnConstraints);
Button btn = new Button(Integer.toString(j+1));
btn.setPrefSize(40, 40);
gridPane.add(btn, j, i);
}
}
}
}
Dashboard.java
public class sample extends Application{
public static void main(String[] args){
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
Scene scene = new Scene(root, 300, 275);
stage.setTitle("FXML Welcome");
stage.setScene(scene);
stage.show();
}
}
您要为每一行添加列约束,这意味着最终您将拥有 50 * 30 = 1500
约束而不是 30
。您需要在行循环之外的循环中添加列约束。此外,假设在添加约束之前约束列表为空,则无需指定要插入的索引,因为 add
也会插入到 List
的末尾。请检查,如果你真的需要在 fxml 中创建的列约束,因为代码变得有点简单,如果你不需要插入列约束作为列表的倒数第二个元素:
for (int i = 0; i < 30; i++) {
gridPane.getColumnConstraints().add(columnConstraints);
}
for(int i = 0; i < 50; i++){
gridPane.getRowConstraints().add(rowConstraints);
for(int j = 0; j < 30; j++) {
Button btn = new Button(Integer.toString(j + 1));
btn.setPrefSize(40, 40);
gridPane.add(btn, j, i);
}
}
顺便说一句:请注意,AnchorPane
约束对不是 AnchorPane
的子节点的节点没有任何影响;您可以安全地从 fxml 中的 GridPane
中删除这些约束。
我在混javafx
的时候遇到了这样的事情:
我创建了一个 GridPane
,将其包裹在 ScrollPane
中并填充了 Buttons
,但事先将 RowConstraints
和 ColumnConstraints
更改为 GridPane
。
问题是水平滚动条看起来不合适。我相信它 GridPane
这么胖,但怎么会这样呢?
但是垂直滚动条非常好。
sample.fxml
<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="SampleController">
<children>
<ScrollPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<content>
<GridPane fx:id="gridPane" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
</GridPane>
</content>
</ScrollPane>
</children>
</AnchorPane>
sampleController.java
public class SampleController {
@FXML public GridPane gridPane;
@FXML
public void initialize(){
RowConstraints rowConstraints = new RowConstraints(10.0, 40, 40);
ColumnConstraints columnConstraints = new ColumnConstraints(10.0, 40, 40);
int i=0,j=0;
for(i=0; i<50; i++){
gridPane.getRowConstraints().add(i, rowConstraints);
for(j=0; j<30; j++) {
gridPane.getColumnConstraints().add(j, columnConstraints);
Button btn = new Button(Integer.toString(j+1));
btn.setPrefSize(40, 40);
gridPane.add(btn, j, i);
}
}
}
}
Dashboard.java
public class sample extends Application{
public static void main(String[] args){
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
Scene scene = new Scene(root, 300, 275);
stage.setTitle("FXML Welcome");
stage.setScene(scene);
stage.show();
}
}
您要为每一行添加列约束,这意味着最终您将拥有 50 * 30 = 1500
约束而不是 30
。您需要在行循环之外的循环中添加列约束。此外,假设在添加约束之前约束列表为空,则无需指定要插入的索引,因为 add
也会插入到 List
的末尾。请检查,如果你真的需要在 fxml 中创建的列约束,因为代码变得有点简单,如果你不需要插入列约束作为列表的倒数第二个元素:
for (int i = 0; i < 30; i++) {
gridPane.getColumnConstraints().add(columnConstraints);
}
for(int i = 0; i < 50; i++){
gridPane.getRowConstraints().add(rowConstraints);
for(int j = 0; j < 30; j++) {
Button btn = new Button(Integer.toString(j + 1));
btn.setPrefSize(40, 40);
gridPane.add(btn, j, i);
}
}
顺便说一句:请注意,AnchorPane
约束对不是 AnchorPane
的子节点的节点没有任何影响;您可以安全地从 fxml 中的 GridPane
中删除这些约束。