标签:
package com.marer.view;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import java.util.HashMap;
/**
* Created by CatScan on 2016/6/23.
*/
public class StageController {
//建立一个专门存储Stage的Map,全部用于存放Stage对象
private HashMap<String, Stage> stages = new HashMap<String, Stage>();
/**
* 将加载好的Stage放到Map中进行管理
*
* @param name 设定Stage的名称
* @param stage Stage的对象
*/
public void addStage(String name, Stage stage) {
stages.put(name, stage);
}
/**
* 通过Stage名称获取Stage对象
*
* @param name Stage的名称
* @return 对应的Stage对象
*/
public Stage getStage(String name) {
return stages.get(name);
}
/**
* 将主舞台的对象保存起来,这里只是为了以后可能需要用,目前还不知道用不用得上
*
* @param primaryStageName 设置主舞台的名称
* @param primaryStage 主舞台对象,在Start()方法中由JavaFx的API建立
*/
public void setPrimaryStage(String primaryStageName, Stage primaryStage) {
this.addStage(primaryStageName, primaryStage);
}
/**
* 加载窗口地址,需要fxml资源文件属于独立的窗口并用Pane容器或其子类继承
*
* @param name 注册好的fxml窗口的文件
* @param resources fxml资源地址
* @param styles 可变参数,init使用的初始化样式资源设置
* @return 是否加载成功
*/
public boolean loadStage(String name, String resources, StageStyle... styles) {
try {
//加载FXML资源文件
FXMLLoader loader = new FXMLLoader(getClass().getResource(resources));
Pane tempPane = (Pane) loader.load();
//通过Loader获取FXML对应的ViewCtr,并将本StageController注入到ViewCtr中
ControlledStage controlledStage = (ControlledStage) loader.getController();
controlledStage.setStageController(this);
//构造对应的Stage
Scene tempScene = new Scene(tempPane);
Stage tempStage = new Stage();
tempStage.setScene(tempScene);
//配置initStyle
for (StageStyle style : styles) {
tempStage.initStyle(style);
}
//将设置好的Stage放到HashMap中
this.addStage(name, tempStage);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 显示Stage但不隐藏任何Stage
*
* @param name 需要显示的窗口的名称
* @return 是否显示成功
*/
public boolean setStage(String name) {
this.getStage(name).show();
return true;
}
/**
* 显示Stage并隐藏对应的窗口
*
* @param show 需要显示的窗口
* @param close 需要删除的窗口
* @return
*/
public boolean setStage(String show, String close) {
getStage(close).close();
setStage(show);
return true;
}
/**
* 在Map中删除Stage加载对象
*
* @param name 需要删除的fxml窗口文件名
* @return 是否删除成功
*/
public boolean unloadStage(String name) {
if (stages.remove(name) == null) {
System.out.println("窗口不存在,请检查名称");
return false;
} else {
System.out.println("窗口移除成功");
return true;
}
}
}
ControlledStage controlledStage = (ControlledStage) loader.getController();
controlledStage.setStageController(this);
/**
* Created by CatScan on 2016/6/23.
*/
public interface ControlledStage {
public void setStageController(StageController stageController);
}
package com.marer.view;
import javafx.fxml.Initializable;
import java.net.URL;
import java.util.ResourceBundle;
/**
* Created by CatScan on 2016/6/21.
*/
public class LoginViewController implements ControlledStage, Initializable {
StageController myController;
public void setStageController(StageController stageController) {
this.myController = stageController;
}
public void initialize(URL location, ResourceBundle resources) {
}
public void goToMain(){
myController.setStage(MainApp.mainViewID);
}
}
package com.marer.view;
/**
* Created by CatScan on 2016/6/19.
*/
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class MainApp extends Application {
public static String mainViewID = "MainView";
public static String mainViewRes = "MainView.fxml";
public static String loginViewID = "LoginView";
public static String loginViewRes = "LoginView.fxml";
private StageController stageController;
@Override
public void start(Stage primaryStage) {
//新建一个StageController控制器
stageController = new StageController();
//将主舞台交给控制器处理
stageController.setPrimaryStage("primaryStage", primaryStage);
//加载两个舞台,每个界面一个舞台
stageController.loadStage(loginViewID, loginViewRes, StageStyle.UNDECORATED);
stageController.loadStage(mainViewID, mainViewRes);
//显示MainView舞台
stageController.setStage(mainViewID);
}
public static void main(String[] args) {
launch(args);
}
}
public static String mainViewID = "MainView";
public static String mainViewRes = "MainView.fxml";
public static String loginViewID = "LoginView";
public static String loginViewRes = "LoginView.fxml";
//加载两个舞台,每个界面一个舞台
stageController.loadStage(loginViewID, loginViewRes, StageStyle.UNDECORATED);
stageController.loadStage(mainViewID, mainViewRes);
//显示MainView舞台
stageController.setStage(mainViewID);
* loadStage(String ,String):加载fxml资源文件并对对应的fxml控制器注入StageController控制器对象。
* setStage(String):显示对应ID的窗口,该窗口已经而且必须是被加载过的,否则会抛出空指针异常。
* setStage(String ,String):显示第一个ID参数的窗口对象,隐藏第二个ID参数的窗口对象。
* unloadStage(String):根据ID卸载已经加载的窗口对象。
标签:
原文地址:http://blog.csdn.net/nthack5730/article/details/51901593