首页 > 技术文章 > JavaFXML实现新窗口打开

Coeus-P 2018-05-28 21:11 原文

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

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

<?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(); // 显示页面
	}
}

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

推荐阅读