在JavaFX中加载新的FXML时如何防止最大化窗口调整大小?

时间:2018-04-08 08:30:56

标签: java javafx window fxml

我在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。

非常感谢你的时间。如果问题需要更清晰,请告诉我。我会解决它。

1 个答案:

答案 0 :(得分:0)

您可以尝试Mapping C semantics to Swift问题中提供的答案。 this以两种不同的方式解决问题。第一个在加载新场景时更改根,第二个解决方案建议使用提供的宽度和高度值启动新场景。