2017-11-11 65 views
0

當我和javafx瞎搞,我以前遇到過這樣一件事:
我創建了一個GridPane,包裹在一個ScrollPane和充滿Buttons,但改變RowConstraintsColumnConstraints爲預先提供GridPane

問題是水平滾動條看起來不足。我相信這是一個GridPane胖,但它是怎麼發生的?
This is what i'm getting when running the code.

但是,垂直滾動條是完美的。JavaFX的GridPane在ScrollPane中是大於預期

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(); 
    } 
} 
+0

擺脫RowConstraints和ColumnConstraints。你不需要它們。 – VGR

回答

1

您要添加的列列約束的每一行,這意味着最終你將有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); 
    } 
} 

BTW:請注意,AnchorPane約束對不是AnchorPane子節點的節點沒有任何影響;您可以安全地從fxml中的GridPane中刪除這些約束。

+0

>如果您確實需要在fxml中創建列約束,請檢查。
確實,我不需要它。它是由SceneBuilder創建的,我認爲它是無用的。真的,事實並非如此。我已經從fxml和控制器中刪除了所有'col/rowConstraints'實例,現在一切正常 – Quipex