页面切换
构建一个主Stage和多个副Stage页面(构建方式基本上市一样的); 在主Stage中设置某些控件的动作,这些动作通过触发副Stage页面的stage.show和stage.hide来实现副Stage的打开和关闭(或者将关闭动作绑定在副Stage的控件上); 主Stage和副Stage之间的数据交换,可以通过在主Stage或副Stage上储存相应的数据类,通过其进行数据交换(交换动作一般发生在副Stage打开或关闭的时间);
【Primary - Controller】 public class Controller { @FXML Button newPage; //弹窗页面触发按钮 public void initialize(){ //弹出新页面 newPage.setOnAction((ActionEvent e)->{ Popup.Data data = Popup.showDialog(); //弹出窗口,并获取交换数据 //控制台打印交换数据 System.out.println(data.getId()+"\n"+data.getName()+"\n"+data.getCity()); }); } }
【Primary - Controller】
public class Controller {
@FXML Button newPage; //弹窗页面触发按钮
public void initialize(){
//弹出新页面
newPage.setOnAction((ActionEvent e)->{
Popup.Data data = Popup.showDialog(); //弹出窗口,并获取交换数据
//控制台打印交换数据
System.out.println(data.getId()+"\n"+data.getName()+"\n"+data.getCity());
});
}
【Popup - Main】 public class Popup extends AnchorPane { private static Popup popup; //本类实例内部封装在静态数据域, private Data data ; //对外交换输出使用的自定义数据结构 private Controller controller; priavte Stage primaryStage; //本类实例内部封装在静态数据域,构造方法私有 private Popup(){ try{ FXMLLoader fxmlloader = new FXMLloader(getClass().getResource("myDialog.fxml")) Parent root = FXMLLoader.load(); primaryStage = new Stage(); primaryStage.setResizable(false); //固定窗口大小 primaryStage.setTitle("Input your message"); primaryStage.setScene(new Scene(root,300,275)); Controller controller = fxmlloader.getControler(); controller.start(popup); //传递Popup实例对象,同时启动Controller的按钮动作绑定 }catch(IOException ex){ ex.printStackTrace(); } } //外部调用方法:显示弹窗,返回数据交换用的数据结构 public static Data showPopup(){ popup = new Popup(); if(primaryStage != null) primaryStage.showAndWait(); //显示弹窗,并中将原线程挂起;如果没有获取数据的需求,可以直接 primaryStage.show(); return popup.getData(); } //实例方法:关闭弹窗 public void hide(){ if(primaryStage != null) primaryStage.hide(); } //实例方法:获取交换数据 public Data getData(){ return data; } //对外交换输出使用的自定义数据结构 public static class Data{ private String id; private String name; private String city; public Data(){ } public Data(String id,String name,String city){ this.id = id; this.name = name; this.city = city; } //省略数据域的get、set方法 }
【Popup - Main】
public class Popup extends AnchorPane {
private static Popup popup; //本类实例内部封装在静态数据域,
private Data data ; //对外交换输出使用的自定义数据结构
private Controller controller;
priavte Stage primaryStage;
//本类实例内部封装在静态数据域,构造方法私有
private Popup(){
try{
FXMLLoader fxmlloader = new FXMLloader(getClass().getResource("myDialog.fxml"))
Parent root = FXMLLoader.load();
primaryStage = new Stage();
primaryStage.setResizable(false); //固定窗口大小
primaryStage.setTitle("Input your message");
primaryStage.setScene(new Scene(root,300,275));
Controller controller = fxmlloader.getControler();
controller.start(popup); //传递Popup实例对象,同时启动Controller的按钮动作绑定
}catch(IOException ex){
ex.printStackTrace();
//外部调用方法:显示弹窗,返回数据交换用的数据结构
public static Data showPopup(){
popup = new Popup();
if(primaryStage != null)
primaryStage.showAndWait();
//显示弹窗,并中将原线程挂起;如果没有获取数据的需求,可以直接 primaryStage.show();
return popup.getData();
//实例方法:关闭弹窗
public void hide(){
primaryStage.hide();
//实例方法:获取交换数据
public Data getData(){
return data;
//对外交换输出使用的自定义数据结构
public static class Data{
private String id;
private String name;
private String city;
public Data(){
public Data(String id,String name,String city){
this.id = id;
this.name = name;
this.city = city;
//省略数据域的get、set方法
【Popup - Controller】 public class Controller { @FXML Button ok; @FXML Button cancel; @FXML TextField tfId; @FXML TextField tfName; @FXML TextField tfCity; public void initialize(){ } public void start(Popup popup){ //获取Main传递归来的Popup实例 //提交按钮 ok.setOnAction((ActionEvent e)->{ popup.getData() = new Popup.Date(tfId.getText(),tfName.getText(),tfCity.getText()); //储存交换数据 popup.hide(); }); //取消按钮 cancel.setOnAction((ActionEvent e)->{ popup.hide(); }); }
【Popup - Controller】
@FXML Button ok;
@FXML Button cancel;
@FXML TextField tfId;
@FXML TextField tfName;
@FXML TextField tfCity;
public void start(Popup popup){ //获取Main传递归来的Popup实例
//提交按钮
ok.setOnAction((ActionEvent e)->{
popup.getData() = new Popup.Date(tfId.getText(),tfName.getText(),tfCity.getText());
//储存交换数据
popup.hide();
//取消按钮
cancel.setOnAction((ActionEvent e)->{
【Primary - Controller】 public class Controller { @FXML Button newPage; //弹窗页面触发按钮 public void initialize(){ //弹出新页面 newPage.setOnAction((ActionEvent e)->{ Popup.showPopup(); //弹出窗口 Popup.showPopup("hello world"); //传递参数,并弹出窗口 }); } }
Popup.showPopup(); //弹出窗口
Popup.showPopup("hello world"); //传递参数,并弹出窗口
【Popup - Main】 public class Popup extends AnchorPane { private static Popup popup; private String param; priavte Stage stage; //构造方法:私有 private Popup(param){ this.param = param; try{ Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); Stage stage = new Stage(); stage.setTitle(engine.getTitle()); stage.setScene(new Scene(root,800,600)); }catch(IOException ex){ ...... } } priavte Popup(){ this("no param"); } public Stage getStage(){ return this.stage; } //外部调用方法 public static void showPopup(String param){ popup = new Popup(param); //构造实例 popup.getStage().show(); //显示页面 } public static void showPopup(){ popup = new Popup(param); //构造实例 popup.getStage().show(); //显示页面 } }
private static Popup popup;
private String param;
priavte Stage stage;
//构造方法:私有
private Popup(param){
this.param = param;
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
Stage stage = new Stage();
stage.setTitle(engine.getTitle());
stage.setScene(new Scene(root,800,600));
......
priavte Popup(){
this("no param");
public Stage getStage(){
return this.stage;
//外部调用方法
public static void showPopup(String param){
popup = new Popup(param); //构造实例
popup.getStage().show(); //显示页面
public static void showPopup(){
调用: button.setOnAction(event->{ new Popup(); });
调用:
button.setOnAction(event->{
new Popup();
【Popup-Main】 public class Popup{ public Popup(){ Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); Stage stage = new Stage(); stage.setTitle(engine.getTitle()); stage.setScene(new Scene(root,800,600)); stage.show(); } }
public class Popup{
public Popup(){
stage.show();