JavaFXML实现新窗口打开

实现原理顺着往下看就明白了,流程看红色字体。具体还有什么问题可以留言。

主页面配置文件,一共三个按钮。这里说明第一个按钮触发打开新窗口

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

<!--导入JavaFXML类-->
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<!--布局控件BorderPane,fx:controller属性用于声明事件处理的Controller,值为Controller类的类全名-->
<!--xmlns用于声明默认命名空间,这里的声明随着你安装的Java JDK版本号的不同可以不同,但是最好不要比你安装的JDK版本高-->
<BorderPane fx:controller="APP.mainController" xmlns="http://javafx.com/javafx/8.0.31" xmlns:fx="http://javafx.com/fxml/1">
   <center>
<VBox fx:id="vBox" alignment="CENTER" spacing="25" >
   <Button fx:id="b1" text="FOO管理" onAction="#fooButtonAction">
        <font>
<Font name="Times New Roman" size="15" />
 </font>
       </Button>
       <Button fx:id="b2" text="Goods管理" onAction="#goodhandleButtonAction">
        <font>
<Font name="Times New Roman" size="15" />
 </font>
       </Button>
       <Button fx:id="b3" text="统计检索" onAction="#searchhandleButtonAction">
        <font>
<Font name="Times New Roman" size="15" />
 </font>
       </Button>
       
</VBox>
   </center>
</BorderPane>

主页面的控制类

package APP;

import java.io.IOException;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;

public class mainController {

    @FXML
    private Button b1;
    @FXML
    private Button b2;
    @FXML
    private Button b3;
    @FXML
    protected void fooButtonAction(ActionEvent event) throws IOException {
    
        FooPane.showFooPane();
    
    }
    @FXML
    protected void goodhandleButtonAction(ActionEvent event) throws IOException {
    
        GoodsPane.showFooPane();
    
    }
    @FXML
    protected void searchhandleButtonAction(ActionEvent event) throws IOException {
    
        searchPane.showFooPane();
    }
    
    
    
}

主页面启动类

package APP;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class MainPaneFxml extends Application {
    @Override
public void start(Stage primaryStage) throws Exception {
try {
BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("main.fxml"));
Scene scene = new Scene(root, 500, 250);
primaryStage.setScene(scene);
primaryStage.setTitle("主程序");
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
    Application.launch(args);
}
}

点击第一个按钮以后打开的窗口的配置文件

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

<!--导入JavaFXML类-->
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<!--布局控件BorderPane,fx:controller属性用于声明事件处理的Controller,值为Controller类的类全名-->
<!--xmlns用于声明默认命名空间,这里的声明随着你安装的Java JDK版本号的不同可以不同,但是最好不要比你安装的JDK版本高-->
<BorderPane fx:controller="APP.FooController" xmlns="http://javafx.com/javafx/8.0.31" xmlns:fx="http://javafx.com/fxml/1">
   <center>
    <GridPane alignment="center" hgap="5" vgap="10">
        <children>
            <Label text="姓名" GridPane.columnIndex="0" GridPane.rowIndex="0"/>
                <TextField fx:id="fName" GridPane.columnIndex="1" GridPane.rowIndex="0" alignment="center_right"/>
                
                <Label text="身份证" GridPane.columnIndex="0" GridPane.rowIndex="1"/>
                <TextField fx:id="fIDcard" GridPane.columnIndex="1" GridPane.rowIndex="1" alignment="center_right"/>
                
                <Label text="省" GridPane.columnIndex="0" GridPane.rowIndex="2"/>
                <TextField fx:id="fProvince" GridPane.columnIndex="1" GridPane.rowIndex="2" alignment="center_right"/>
                
                <Label text="市" GridPane.columnIndex="0" GridPane.rowIndex="3"/>
                <TextField fx:id="fCity" GridPane.columnIndex="1" GridPane.rowIndex="3" alignment="center_right"/>
                
                <Label text="乡" GridPane.columnIndex="0" GridPane.rowIndex="4"/>
                <TextField fx:id="fTown" GridPane.columnIndex="1" GridPane.rowIndex="4" alignment="center_right"/>
                
                <Label text="村" GridPane.columnIndex="0" GridPane.rowIndex="5"/>
                <TextField fx:id="fVillage" GridPane.columnIndex="1" GridPane.rowIndex="5" alignment="center_right"/>
        
            <Button fx:id="b1" text="导出FOO为HTML封装" onAction="#htmlButtonAction" GridPane.columnIndex="0" GridPane.rowIndex="6"> 
                
                
                <font>
        <Font name="Times New Roman" size="15" />
        </font>
                </Button>
                <Button fx:id="b2" text="导出FOO为XML封装" onAction="#xmlButtonAction" GridPane.columnIndex="1" GridPane.rowIndex="6">
                
                <font>
        <Font name="Times New Roman" size="15" />
        </font>
            </Button>
                
        </children>
    </GridPane>
   </center>
</BorderPane>

点击第一个按钮以后出发的操作

@FXML
    protected void fooButtonAction(ActionEvent event) throws IOException {
    
        FooPane.showFooPane();
    
    }

上述方法里类的源代码。在这个类里面加载了新窗口的配置文件

package APP;

import java.io.IOException;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class FooPane extends AnchorPane {
    private static FooPane fooPane;
    private Stage stage;
    // 构造方法:私有
    private FooPane() {
        try {
            BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("FOO.fxml"));
            stage = new Stage();
            stage.setTitle("FOO管理");
            stage.setScene(new Scene(root, 500, 250));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    public Stage getStage() {
        return this.stage;
    }
    // 外部调用方法
    public static void showFooPane() {
        fooPane = new FooPane(); // 构造实例
        fooPane.getStage().show(); // 显示页面
    }
}

上述是没有数据交互的打开新窗口,如果想在打开新窗口的同时初始化新窗口页面显示的内容,评论区留言。

猜你喜欢

转载自www.cnblogs.com/Coeus-P/p/9102275.html