从现有控制器加载的场景未与中心对齐-JavaFX

从现有控制器加载的场景未与中心对齐-JavaFX,java,javafx,fxml,Java,Javafx,Fxml,我正在写一个由两个不同场景组成的程序,每个场景都设计有一个FXML文件,每个场景都有自己的控制器。我的初始场景工作正常,它出现在屏幕中央,但当我尝试从第一个场景的控制器加载第二个场景时,我发现它不像另一个场景那样出现在屏幕中央 有人能帮我吗?这把我吓坏了! 下面是一些代码: @Override public void start(Stage primaryStage) { try { //Create an FXMLLoader FXMLLoader ro

我正在写一个由两个不同场景组成的程序,每个场景都设计有一个FXML文件,每个场景都有自己的控制器。我的初始场景工作正常,它出现在屏幕中央,但当我尝试从第一个场景的控制器加载第二个场景时,我发现它不像另一个场景那样出现在屏幕中央

有人能帮我吗?这把我吓坏了! 下面是一些代码:

@Override
public void start(Stage primaryStage) {
    try {
        //Create an FXMLLoader
        FXMLLoader rootLoader = new FXMLLoader(getClass().getResource("MainScene.fxml"));

        //Instantiate a new controller with parameter and sets it to the FXMLLoader
        MainController mainController = new MainController(primaryStage);
        rootLoader.setController(mainController);

        //Sets the layout
        Group root = rootLoader.load();
        Scene startScene = new Scene(root);

        //Sets the stage's scene
        primaryStage.initStyle(StageStyle.TRANSPARENT);
        primaryStage.setScene(startScene);
        primaryStage.show();
    } catch(Exception e) {
        e.printStackTrace();
    }
}
这是主要的

public void initialize() {

    FXMLLoader playSceneLoader = new FXMLLoader(getClass().getResource("PlayScene.fxml"));

    try {
        Group playSceneLayout = playSceneLoader.load();
        playScene = new Scene(playSceneLayout, Screen.getPrimary().getBounds().getMaxX(), Screen.getPrimary().getBounds().getMaxY());
        playScene.setFill(Color.TRANSPARENT);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
这是来自第一个创建程序初始场景的控制器

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

<?import javafx.scene.Group?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>


<Group xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <GridPane prefHeight="300.0" prefWidth="500.0">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <AnchorPane prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: #A47888#A47888;">
               <children>
                  <Label fx:id="playLabel" layoutX="90.0" layoutY="129.0" onMouseClicked="#startLabelClicked" text="Play" textFill="#77354c">
                     <font>
                        <Font name="AvidOmnes Light" size="41.0" />
                     </font>
                  </Label>
               </children>
            </AnchorPane>
            <AnchorPane prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: #77354C#77354C;" GridPane.columnIndex="1">
               <children>
                  <Label fx:id="titleLabel" layoutX="77.0" layoutY="129.0" text="Titolo" textFill="#a47888">
                     <font>
                        <Font name="AvidOmnes Light" size="40.0" />
                     </font>
                  </Label>
                  <Label fx:id="closeLabel" layoutX="232.0" layoutY="6.0" onMouseClicked="#closeRoot" text="X" textFill="#a47888" />
               </children>
            </AnchorPane>
         </children>
      </GridPane>
   </children>
</Group>

这是初始页面的FXML文件

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

<?import javafx.scene.Group?>
<?import javafx.scene.shape.Circle?>


<Group xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.PlayController">
   <children>
      <Circle fx:id="startCircle" fill="DODGERBLUE" onMouseClicked="#startCircleClicked" radius="100.0" stroke="BLACK" strokeType="INSIDE" />
   </children>
</Group>


这是第二个场景。

这是绝对正常的,你只得到
圆的一部分,因为你没有定义中心坐标,然后默认位于
组的位置(0,0)

为了在屏幕的左上角看到它,您必须在单击
标签时最大化您的
阶段

下面是一个例子:(由于您对代码的信息很吝啬,我即兴制作,因此重要的修改是在
startabelclicked


这是绝对正常的,您只得到
圆的一部分
,因为您没有定义中心坐标,然后默认位于
组的位置(0,0)

为了在屏幕的左上角看到它,您必须在单击
标签时最大化您的
阶段

下面是一个例子:(由于您对代码的信息很吝啬,我即兴制作,因此重要的修改是在
startabelclicked


在不调整圆的
x
y
属性的情况下,圆的中心位于场景的左上角。由于javafx不显示场景之外的任何内容,因此您将看到左下角的四分之一圆

要在场景的左上角完全显示圆,应将圆放置在具有某种布局的布局中。例如,
AnchorPane
带有
topAnchor
leftAnchor
为圆设置的属性将起作用,但实现所需结果的最简单方法是使用带有左上对齐的
StackPane


在不调整圆的
x
y
属性的情况下,圆的中心位于场景的左上角。由于javafx不显示场景之外的任何内容,因此您将看到左下角的四分之一圆

要在场景的左上角完全显示圆,应将圆放置在具有某种布局的布局中。例如,
AnchorPane
带有
topAnchor
leftAnchor
为圆设置的属性将起作用,但实现所需结果的最简单方法是使用带有左上对齐的
StackPane



您是在同一阶段还是在不同阶段显示场景?什么是不是在你的屏幕,第二个<代码>场景> <代码>在相同的<代码>阶段>代码>还是第二个<代码>阶段< /代码>?我猜是场景,因为第一个控制器没有创建任何新的阶段。好吧,也许我得到了,你希望你的<代码>圆圈<代码>在你点击“你的代码>标签< /代码>的时候就在你的屏幕中间。“玩“?不,我的圆圈在组内,所以我希望在组的左上角看到它,实际上我只看到它的一部分,但这不会发生在屏幕的左上角。我在靠近屏幕中间的某个点上得到了一个圆的切片。你是在同一个舞台上还是在另一个舞台上展示你的场景?什么是不是在你的屏幕,第二个<代码>场景> <代码>在相同的<代码>阶段>代码>还是第二个<代码>阶段< /代码>?我猜是场景,因为第一个控制器没有创建任何新的阶段。好吧,也许我得到了,你希望你的<代码>圆圈<代码>在你点击“你的代码>标签< /代码>的时候就在你的屏幕中间。“玩“?不,我的圆圈在组内,所以我希望在组的左上角看到它,实际上我只看到它的一部分,但这不会发生在屏幕的左上角。我在靠近屏幕中间的某个点上看到了一个圆圈。很抱歉,我看起来很吝啬,但出于易读性的原因,我不想发布大量代码。不管怎样,现在它工作了!但我仍然有一些疑问。你为什么把主体放在括号中间?现在还有一个小问题:当第二个场景加载时,我的圆圈从其开始位置滑动到左上角。我怎样才能避免这种“动画”?括号是一个输入错误(在我看到你作为参数通过舞台之前,我使用了另一个组件来获取舞台),我将编辑文章并删除它们。我不复制
圆圈的“幻灯片”
。我会看一看(但我使用的是Java8,而不是像你一样使用Java10,也许这就是原因)。此外,当你发布问题以获得解决方案时,最好的方法是编写一个解决方案。对每个人来说都比较容易,因为这有助于你以另一种方式再现问题,而对那些能够帮助你的人来说,这更容易理解
public class MainController {

    private Stage mainStage;
    private Scene playScene;

    public MainController(Stage pMainStage) {
        mainStage = pMainStage;
    }

    @FXML
    public void initialize() {

        FXMLLoader playSceneLoader = new FXMLLoader(getClass().getResource("PlayScene.fxml"));

        try {
            Parent playSceneLayout = playSceneLoader.load();
            playScene = new Scene(playSceneLayout, Screen.getPrimary().getBounds().getMaxX(), Screen.getPrimary().getBounds().getMaxY());
            playScene.setFill(Color.TRANSPARENT);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @FXML
    private void startLabelClicked() {
        mainStage.setScene(playScene);
        // This line will help you to extend your stage, which contains your scene.
        mainStage.setMaximized(true);
    }

    @FXML
    private void closeRoot() {
        System.out.println("Closing.");
        Platform.exit();
    }
}