我目前正在将所有.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部分有关。但是我在尝试正确使用语法时遇到了麻烦。
答案 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
要复杂一些,但是Pane
和Group
允许您修改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
类应该是程序的“入口点”。