页面切换
JavaFX多个页面(Stage)之间的切换的实现的基本思路:
构建一个主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());
});
}
}
Popup页面
【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 - 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();
});
}
不带数据交换的弹出窗口
主页面
【Primary - Controller】
public class Controller {
@FXML Button newPage; //弹窗页面触发按钮
public void initialize(){
//弹出新页面
newPage.setOnAction((ActionEvent e)->{
Popup.showPopup(); //弹出窗口
Popup.showPopup("hello world"); //传递参数,并弹出窗口
});
}
}
Popup页面
【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(); //显示页面
}
}
最简便方法
调用:
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();
}
}