2017-07-01 77 views
1

我有两个问题,下面的代码,试图弄清楚了半晌,最终解决:调整大小GridPane的节点

1 - 因为它下面的图片中所示,AnchorPane不跟随height属性我为所定义,使用SceneBuilder,应该完全装配到gridpane和跨度3行的第2栏,然而,它开始从gridpane的顶部突出:

​​

enter image description here

第二个也是最重要的问题是,尽管我明确地定义了FXML中的列和行约束,并分别使它们的VGrow和HGrow被启用,但是当我最大化窗口时,GridPane根本不会缩放。但是,我希望它填满屏幕。

enter image description here

<Pane fx:id="LocusPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="400.0" minWidth="700.0" style="-fx-border-color: black;" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controllers.AddLocusController"> 
<children> 
    <GridPane fx:id="LocusGridPane" alignment="CENTER" hgap="10.0" layoutX="-14.0" minHeight="300.0" minWidth="600.0" vgap="10.0"> 
     <columnConstraints> 
      <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="10.0" prefWidth="130.0" /> 
      <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="10.0" prefWidth="238.0" /> 
      <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="10.0" prefWidth="277.0" /> 
     </columnConstraints> 
     <rowConstraints> 
      <RowConstraints maxHeight="1.7976931348623157E308" minHeight="10.0" prefHeight="107.0" vgrow="ALWAYS" /> 
      <RowConstraints maxHeight="1.7976931348623157E308" minHeight="10.0" prefHeight="125.0" vgrow="ALWAYS" /> 
      <RowConstraints maxHeight="1.7976931348623157E308" minHeight="10.0" prefHeight="118.0" vgrow="ALWAYS" /> 
     </rowConstraints> 
     <children> 
      <Label alignment="TOP_CENTER" text="Locus Management Panel" textAlignment="CENTER" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.hgrow="ALWAYS" GridPane.valignment="TOP" GridPane.vgrow="ALWAYS"> 
       <padding> 
        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
       </padding> 
       <GridPane.margin> 
        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
       </GridPane.margin> 
       <font> 
        <Font size="24.0" /> 
       </font> 
      </Label> 
      <Label text="Locus:" GridPane.halignment="CENTER" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1" GridPane.valignment="CENTER" GridPane.vgrow="ALWAYS"> 
       <font> 
        <Font size="18.0" /> 
       </font> 
      </Label> 
      <TextField fx:id="Locus" alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="37.0" prefWidth="223.0" promptText="Enter the locus name here.." GridPane.columnSpan="2" GridPane.halignment="RIGHT" GridPane.rowIndex="1"> 
       <padding> 
        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
       </padding> 
       <GridPane.margin> 
        <Insets /> 
       </GridPane.margin> 
      </TextField> 
      <Button fx:id="Add" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#Add" prefHeight="30.0" prefWidth="100.0" text="Add" GridPane.columnIndex="1" GridPane.rowIndex="2" /> 
      <Button fx:id="Delete" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#Delete" prefHeight="30.0" prefWidth="100.0" text="Remove" GridPane.columnIndex="1" GridPane.halignment="RIGHT" GridPane.rowIndex="2" /> 
      <AnchorPane fx:id="ListViewHolder" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.hgrow="ALWAYS" GridPane.rowSpan="3" GridPane.valignment="CENTER" GridPane.vgrow="ALWAYS"> 
       <GridPane.margin> 
        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
       </GridPane.margin> 
       <cursor> 
        <Cursor fx:constant="CLOSED_HAND" /> 
       </cursor> 
      <padding> 
       <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
      </padding> 
      </AnchorPane> 
     </children> 
     <padding> 
      <Insets bottom="40.0" left="40.0" right="40.0" top="40.0" /> 
     </padding> 
    </GridPane> 
</children> 

+0

你能发布足够的代码来实际重现问题吗?在屏幕截图中,你的'GridPane'里面有一个'ListView',它不在FXML文件中。如果你使它自成一体并且完整,它也会使人们更容易回答你的问题;没有人希望通过FXML并添加所有必要的导入,并且可以删除对控制器及其方法的引用。 –

回答

1

为了防止AnchorPaneGridPane溢出其区域的,不显式地设置的行的优选高度;让他们调整自己的内容(默认行为)。

调整窗口大小时不调整GridPane的原因是它被包装在Pane(它基本上不执行布局)。你可以忽略包装窗格,并且使得FXML的根目录为GridPane?如果不是,则使用使GridPane增长以适合整个内容的布局(例如,使用BorderPane作为包装,并将GridPane放在中间:此处有许多其他选项)。

SSCCE:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.String?> 


<?import javafx.collections.FXCollections?> 
<?import javafx.scene.layout.BorderPane?> 
<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.layout.ColumnConstraints?> 
<?import javafx.scene.layout.RowConstraints?> 
<?import javafx.scene.control.Label?> 
<?import javafx.geometry.Insets?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.control.Button?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.text.Font?> 
<?import javafx.scene.Cursor?> 
<?import javafx.scene.control.ListView?> 

<BorderPane fx:id="LocusPane" maxHeight="1.7976931348623157E308" 
    maxWidth="1.7976931348623157E308" minHeight="400.0" minWidth="700.0" 
    style="-fx-border-color: black;" xmlns="http://javafx.com/javafx/8.0.111" 
    xmlns:fx="http://javafx.com/fxml/1"> 
    <center> 
     <GridPane fx:id="LocusGridPane" gridLinesVisible="true" 
      alignment="CENTER" hgap="10.0" layoutX="-14.0" minHeight="300.0" 
      minWidth="600.0" vgap="10.0"> 
      <columnConstraints> 
       <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" 
        minWidth="10.0" prefWidth="130.0" /> 
       <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" 
        minWidth="10.0" prefWidth="238.0" /> 
       <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" 
        minWidth="10.0" prefWidth="277.0" /> 
      </columnConstraints> 
      <rowConstraints> 
       <RowConstraints maxHeight="1.7976931348623157E308" 
        minHeight="10.0" vgrow="ALWAYS" /> 
       <RowConstraints maxHeight="1.7976931348623157E308" 
        minHeight="10.0" vgrow="ALWAYS" /> 
       <RowConstraints maxHeight="1.7976931348623157E308" 
        minHeight="10.0" vgrow="ALWAYS" /> 
      </rowConstraints> 
      <children> 
       <Label alignment="TOP_CENTER" text="Locus Management Panel" 
        textAlignment="CENTER" GridPane.columnSpan="2" GridPane.halignment="CENTER" 
        GridPane.hgrow="ALWAYS" GridPane.valignment="TOP" GridPane.vgrow="ALWAYS"> 
        <padding> 
         <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
        </padding> 
        <GridPane.margin> 
         <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
        </GridPane.margin> 
        <font> 
         <Font size="24.0" /> 
        </font> 
       </Label> 
       <Label text="Locus:" GridPane.halignment="CENTER" 
        GridPane.hgrow="ALWAYS" GridPane.rowIndex="1" GridPane.valignment="CENTER" 
        GridPane.vgrow="ALWAYS"> 
        <font> 
         <Font size="18.0" /> 
        </font> 
       </Label> 
       <TextField fx:id="Locus" alignment="CENTER" maxHeight="-Infinity" 
        maxWidth="-Infinity" prefHeight="37.0" prefWidth="223.0" 
        promptText="Enter the locus name here.." GridPane.columnSpan="2" 
        GridPane.halignment="RIGHT" GridPane.rowIndex="1"> 
        <padding> 
         <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
        </padding> 
        <GridPane.margin> 
         <Insets /> 
        </GridPane.margin> 
       </TextField> 
       <Button fx:id="Add" minHeight="-Infinity" minWidth="-Infinity" 
        mnemonicParsing="false" prefHeight="30.0" prefWidth="100.0" text="Add" 
        GridPane.columnIndex="1" GridPane.rowIndex="2" /> 
       <Button fx:id="Delete" maxHeight="-Infinity" maxWidth="-Infinity" 
        minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" 
        prefHeight="30.0" prefWidth="100.0" text="Remove" 
        GridPane.columnIndex="1" GridPane.halignment="RIGHT" 
        GridPane.rowIndex="2" /> 
       <AnchorPane fx:id="ListViewHolder" maxHeight="1.7976931348623157E308" 
        maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" 
        GridPane.columnIndex="2" GridPane.halignment="CENTER" 
        GridPane.hgrow="ALWAYS" GridPane.rowSpan="3" GridPane.valignment="CENTER" 
        GridPane.vgrow="ALWAYS"> 
        <GridPane.margin> 
         <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
        </GridPane.margin> 
        <cursor> 
         <Cursor fx:constant="CLOSED_HAND" /> 
        </cursor> 
        <ListView> 
         <items> 
          <FXCollections fx:factory="observableArrayList"> 
           <String fx:value="D8S1179" /> 
           <String fx:value="D19S433" /> 
          </FXCollections> 
         </items> 
        </ListView> 
        <padding> 
         <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
        </padding> 
       </AnchorPane> 
      </children> 
      <padding> 
       <Insets bottom="40.0" left="40.0" right="40.0" top="40.0" /> 
      </padding> 
     </GridPane> 
    </center> 
</BorderPane> 

测试代码:

import java.io.IOException; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class LayoutTest extends Application { 

    @Override 
    public void start(Stage primaryStage) throws IOException { 
     Scene scene = new Scene(FXMLLoader.load(getClass().getResource("Layout.fxml"))); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

截图:

启动后: enter image description here

调整后: enter image description here