在同一窗口中加载新资源

时间:2018-06-20 11:40:11

标签: java javafx

我目前正在将所有.form文件迁移到.fxml,并且在同一窗口中加载另一个页面时遇到了一些麻烦。

使用.form方法,我能够建立卡布局并在其中进行切换。

我要做的是创建卡布局,并在其中加载表格。

我创建了一些测试.fxml和一些基本代码。它会加载第二个,但会在一个新窗口中,而我正尝试避免将其加载到同一窗口中。

index.fxml

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

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="480.0" prefWidth="320.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Test">
   <children>
      <Button id="btnbuy" fx:id="btnbuy" layoutX="134.0" layoutY="2.0" mnemonicParsing="false" onAction="#loadSecondFxml" text="Purchase" />
      <Button id="btnSell" fx:id="btnsell" layoutX="140.0" layoutY="454.0" mnemonicParsing="false" text="Sell" />
   </children>
</AnchorPane>

MainPage.fxml

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

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="480.0" prefWidth="320.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Test">
   <children>
      <Pane layoutX="6.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="480.0" prefWidth="320.0">
         <children>
            <Label layoutX="146.0" layoutY="232.0" text="You got here" />
         </children></Pane>
   </children>
</AnchorPane>

Test.java

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;

public class Test extends Application {
    private MainPage parentForm;
    //private Panel panel;
    public Button btnbuy;
    public Button btnsell;

    public Test(){
    }
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("Index.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 320, 480));
        primaryStage.show();
    }
    public void loadSecondFxml() throws Exception{
        Stage primaryStage = new Stage();
        Parent root = FXMLLoader.load(getClass().getResource("MainPage.fxml"));
        primaryStage.setTitle("Hi");
        primaryStage.setScene(new Scene(root, 320, 480));
        primaryStage.show();
    }

    public static void main(String args[]){
        launch(args);
    }
}

我知道这与setcene部分有关。但是我在尝试正确使用语法时遇到了麻烦。

1 个答案:

答案 0 :(得分:3)

有多种方法可以做到这一点。哪种最适合您取决于您​​的需求:

替换根

通过替换根,您可以替换窗口中显示的所有内容。

@Override
public void start(Stage primaryStage) {
    final Region r1 = new Region();
    r1.setStyle("-fx-background-color: yellow;");

    final Region r2 = new Region();
    r2.setStyle("-fx-background-color: blue;");

    final Scene scene = new Scene(r1);
    scene.setOnMouseClicked(evt -> {
        scene.setRoot(scene.getRoot() == r1 ? r2 : r1); // swap roots
    });

    primaryStage.setScene(scene);
    primaryStage.show();
}

修改场景的一部分

通过修改场景中的父代,您可以更改显示。

BorderPane

此布局可让您轻松替换(最多)5个节点:

@Override
public void start(Stage primaryStage) {
    final Region r1 = new Region();
    r1.setStyle("-fx-background-color: yellow;");

    final Region r2 = new Region();
    r2.setStyle("-fx-background-color: blue;");

    final BorderPane root = new BorderPane(r1);

    Button btn = new Button("swap");
    btn.setOnAction(evt -> {
        root.setCenter(root.getCenter() == r1 ? r2 : r1);
    });

    root.setTop(btn);

    final Scene scene = new Scene(root, 400, 400);

    primaryStage.setScene(scene);
    primaryStage.show();
}

修改其他布局的子级列表

这可能比使用BorderPane要复杂一些,但是PaneGroup允许您修改children列表以修改布局:

@Override
public void start(Stage primaryStage) {
    final Region r1 = new Region();
    r1.setStyle("-fx-background-color: yellow;");
    VBox.setVgrow(r1, Priority.ALWAYS);

    final Region r2 = new Region();
    r2.setStyle("-fx-background-color: blue;");
    VBox.setVgrow(r2, Priority.ALWAYS);

    final VBox root = new VBox();

    Button btn = new Button("swap");
    btn.setOnAction(evt -> {
        root.getChildren().set(1, root.getChildren().get(1) == r1 ? r2 : r1);
    });

    root.getChildren().addAll(btn, r1);

    final Scene scene = new Scene(root, 400, 400);

    primaryStage.setScene(scene);
    primaryStage.show();
}

TabPane之类的东西也可能满足您的需求。

在fxmls中使用类似的内容要求您提供对管理替换对象的访问。您可以在这里阅读有关此主题的信息:Passing Parameters JavaFX FXML

不过,您不应将Application类用作控制器类。这违反了单一责任原则。此外,每次加载带有指定为fx:controller属性值的类的fxml时,都会创建该类的新实例。 Application类应该是程序的“入口点”。