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