如何使GridPane填充整个场景?(带Eclipse Luna的JavaFX SceneBuilder)

如何使GridPane填充整个场景?(带Eclipse Luna的JavaFX SceneBuilder),java,eclipse,javafx,Java,Eclipse,Javafx,我(和我班的其他同学)正在尝试调整网格窗格的大小,以填充整个场景。下面是它在SceneBuilder中的外观: 如果看不到图像:它只是一个3x3网格窗格(我层次结构中唯一的元素)的图像,其余场景的“灰色空间”围绕网格窗格 这是我的主要代码: package pkgTicTacToe; import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; impo

我(和我班的其他同学)正在尝试调整网格窗格的大小,以填充整个场景。下面是它在SceneBuilder中的外观:

如果看不到图像:它只是一个3x3网格窗格(我层次结构中唯一的元素)的图像,其余场景的“灰色空间”围绕网格窗格

这是我的主要代码:

    package pkgTicTacToe;

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


public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        try {
            GridPane root = (GridPane)FXMLLoader.load(getClass().getResource("ticTacToe.fxml"));
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
这是我的控制器代码:

package pkgTicTacToe;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;

public class ticTacToeController implements Initializable {

    @FXML
    private GridPane root;

    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {
        Image imageX = new Image(getClass().getResource("/pkgTicTacToe/x.gif").toExternalForm());
        Image imageO = new Image(getClass().getResource("/pkgTicTacToe/o.gif").toExternalForm());
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                int status = (int)(Math.random() * 3 );
                if (status == 0) {
                root.add(new ImageView(imageX), j, i);
                }
            else if (status == 1) {
                root.add(new ImageView(imageO), j, i);
                }
            }

        }

    }
}
包pkgTicTacToe;
导入java.net.URL;
导入java.util.ResourceBundle;
导入javafx.fxml.fxml;
导入javafx.fxml.Initializable;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.layout.GridPane;
公共类TictoeController实现可初始化{
@FXML
私有网格根;
@凌驾
公共void初始化(URL arg0,ResourceBundle arg1){
Image imageX=新图像(getClass().getResource(“/pkgTicTacToe/x.gif”).toExternalForm());
Image imageO=new Image(getClass().getResource(“/pkgTicTacToe/o.gif”).toExternalForm();
对于(int i=0;i<3;i++){
对于(int j=0;j<3;j++){
int status=(int)(Math.random()*3);
如果(状态==0){
添加(新的ImageView(imageX),j,i);
}
否则如果(状态==1){
添加(新的ImageView(imageO),j,i);
}
}
}
}
}
这是我的.fxml文件中的代码(在我们的类中,我们不直接“弄乱”.fxml,我们通过SceneBuilder操作这些元素,大部分代码在控制器中):


我试着在右边操纵属性、布局和代码的所有不同元素,并查看了顶部的菜单选项——似乎没有办法让这个吸盘适合!我曾想过创建一个锚网来放置网格窗格,但这绕过了我的问题,而不是真正找到解决方案

为了我班上的其他同学,我更喜欢一个面向使用SceneBuilder的答案。然而,如果您还包括一个代码方法,我也会喜欢,因为我个人更喜欢少用GUI,而直接用键盘


感谢您的时间,如果我遗漏了任何细节或自己没有做足够的研究来找到类似的问题,我深表歉意。

场景的根元素将始终填充整个场景,因此当您运行应用程序时,网格窗格将填充场景。(只需尝试在其上添加背景色即可。)但是,网格窗格本身包含空白。(您在SceneBuilder中看到的当然是相当随意的,因为SceneBuilder只知道FXML,而场景本身是在外部定义和调整大小的。)

您可能真正想问的是如何使网格窗格的内容填充网格窗格(即,您希望列占据它们之间网格窗格的所有宽度)。请注意,您已将所有三列的首选宽度设置为100;由于场景的宽度为400,因此会留下100个像素的未使用空间。(与行类似。)


删除列约束上的
prefWidth
设置,并将所有列约束的
hgrow
值设置为
始终
。(类似地,对于行,
prefHeight
vgrow

我可以问一下,为什么您认为其他解决方案已经过时了尝试将
gridpane
包装到
anchorpane
中,它应该可以正常工作。我想要一个不需要在另一个窗格中包装的解决方案:(
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.GridPane?>

<GridPane fx:id="root" alignment="CENTER" gridLinesVisible="true" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="301.0" prefWidth="465.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="pkgTicTacToe.ticTacToeController">
   <rowConstraints>
      <RowConstraints minHeight="10.0" prefHeight="30.0" />
      <RowConstraints minHeight="10.0" prefHeight="30.0" />
      <RowConstraints minHeight="10.0" prefHeight="30.0" />
   </rowConstraints>
   <columnConstraints>
      <ColumnConstraints minWidth="10.0" prefWidth="100.0" />
      <ColumnConstraints minWidth="10.0" prefWidth="100.0" />
      <ColumnConstraints minWidth="10.0" prefWidth="100.0" />
   </columnConstraints>
</GridPane>