I found this answer but it seems to be outdated or not applicable to my situation.
我(以及我班级的其他成员)正在尝试调整我的GridPane以填充整个场景。以下是SceneBuilder现在的样子:
如果你看不到图像:它只是一个3x3 GridPane(我的层次结构中唯一的元素)的图像,带有"灰色空间" GridPane周围的剩余场景。
这是我的主要代码:
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);
}
}
}
}
}
这是我的.fxml文件中的代码(在我们的类中我们没有#34; mess&#34;直接使用.fxml,我们通过SceneBuilder操作这些元素,并且主要是在控制器中编写代码):
<?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>
我尝试在右侧操作属性,布局和代码的所有不同元素,并查看顶部的菜单选项 - 似乎不是一种方法来实现这一点傻逼!我曾想过创建一个AnchorPane来将GridPane置于其中,但这样可以避开我的问题,而不是真正找到解决方案。
我更倾向于为了我班级的其余部分而使用SceneBuilder的答案。但是,如果你还包括一个代码方法,我也会喜欢这样,因为我个人更喜欢使用GUI,而不是直接使用键盘。
感谢您的时间,如果我遗漏了任何细节或者没有做足够的研究以找到类似的问题,我道歉。
答案 0 :(得分:3)
场景的根元素将始终填充整个场景,因此当您运行应用程序时,网格窗格将填充场景。 (只需尝试在其上添加背景颜色。)但是,网格窗格本身包含空白区域。 (你在SceneBuilder中看到的当然是非常随意的,因为SceneBuilder只知道FXML,并且场景本身是在外部定义和调整的。)
您可能真正要问的是如何使网格窗格的内容填满网格窗格(即您希望列占据网格窗格之间的所有宽度)。请注意,您已将所有三列设置为首选宽度为100;由于场景的宽度为400,因此会留下100像素的未使用空间。 (与行类似。)
删除列约束上的prefWidth
设置,并将所有列约束设置为hgrow
值ALWAYS
。 (类似于行prefHeight
和vgrow
。)