我在SSCCE
中创建了JavaFX
来证明问题。它有两个场景。场景和舞台的维度为600 x 400
。每个场景都有一个按钮。当您按下它时,它会将您带到另一个场景。它工作正常。
问题在于:
如果我在程序window/stage
最大化时更改了场景,则窗口的大小会缩小到600 x 400
并稳定在计算机屏幕的左上角。当我将光标悬停在'最大化/恢复向下'按钮,它说' Restore Down'。所以该计划认为它仍然最大化。但事实并非如此。如果我点击"还原'恢复后,窗口移动到计算机屏幕的中心。
当窗口最大化时,我希望它在更改场景时保持这种状态。有人能告诉我它是如何完成的吗?我对JavaFX
很新。
这里可能有相关的东西。在我的FXML
文件中,您可以看到我已将该按钮放在GridPane
中。 GridPane
位于群组内。该集团位于StackPane
内。这是必要的。因为我更喜欢使用GridPane
。当窗口/舞台调整大小时,我不希望我的按钮textfields
等移动。因此,我将GridPane
置于一个组内。当窗口最大化时,我希望场景居中。所以我已将该组置于StackPane
。
我的SSCCE
有两个FXML
个文件和三个类。一类有主要方法。另外两个类是控制器。
这是主要方法的类:
package com;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Launcher extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
try {
StackPane pane = (StackPane)FXMLLoader.load(getClass().getResource("/com/Scene1.fxml"));
Scene viewScene = new Scene(pane, 600, 400);
primaryStage.setScene(viewScene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
}
第一个场景的控制器类:
package com;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class Scene1Controller implements Initializable {
@FXML
private Label label;
@FXML
private TextField textField;
@Override
public void initialize(URL location, ResourceBundle resources) {
}
public void changeScene(ActionEvent event) throws IOException {
// Changes the scene
StackPane pane = FXMLLoader
.load(getClass().getResource("/com/Scene2.fxml"));
Scene scene = new Scene(pane);
Stage stage = (Stage) ((Node)event.getSource()).getScene().getWindow();
stage.setScene(scene);
stage.show();
}
}
上述控制器的FXML文件。
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.Group?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.StackPane?>
<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.131" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.Scene1Controller">
<children>
<Group>
<children>
<GridPane prefHeight="400.0" prefWidth="600.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="204.0" minHeight="0.0" prefHeight="0.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="370.0" minHeight="10.0" prefHeight="370.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<ImageView fitHeight="400.0" fitWidth="600.0" pickOnBounds="true" preserveRatio="true" GridPane.columnSpan="2" GridPane.rowSpan="2">
<GridPane.margin>
<Insets top="28.0" />
</GridPane.margin>
</ImageView>
<Button mnemonicParsing="false" onAction="#changeScene" text="Go to Scene 2" GridPane.columnSpan="2147483647" GridPane.rowIndex="1">
<GridPane.margin>
<Insets left="260.0" />
</GridPane.margin>
</Button>
</children>
</GridPane>
</children>
</Group>
</children>
</StackPane>
我在这里只共享了一个FXML
文件及其控制器类。这是因为其他FXML
和控制器类与给定的FXML
和控制器几乎完全相同。
在我的搜索过程中,我在这里遇到this问题,建议此人考虑更改根目录而不是场景。我真的不知道它是如何完成的,或者它是否可以解决我的问题。我需要为我的程序屏幕中的每个更改单独的FXML
和Controller。
非常感谢你的时间。如果问题需要更清晰,请告诉我。我会解决它。
答案 0 :(得分:0)
您可以尝试Mapping C semantics to Swift问题中提供的答案。 this以两种不同的方式解决问题。第一个在加载新场景时更改根,第二个解决方案建议使用提供的宽度和高度值启动新场景。