舞台管理器
思路
使用一个容器统一管理舞台对象,并且提供一些常用的方法,比如:添加舞台、获取舞台、显示指定舞台、舞台切换、删除舞台、舞台的初始化等
设计的类
StageManager
舞台管理器
StageInterface
所有的控制器都必须实现该接口,并且在初始化舞台的时候调用该接口的实例化对象用来和舞台管理器绑定
源码
StageManager.java
public class StageManager {
private Map<String,Stage> container = new HashMap<String,Stage>();
public void addStage(String name,Stage stage) {
container.put(name, stage);
}
public void getStage(String name) {
container.get(name);
}
public void showStage(String name) {
Stage showStage = container.get(name);
showStage.show();
}
/**
* 舞台切换
* @param showName 需要显示的
* @param closeName 需要隐藏的
*/
public void toggleStage(String showName,String closeName) {
Stage showStage = container.get(showName);
showStage.show();
Stage closeStage = container.get(closeName);
closeStage.close();
}
//FXML--->Scene的内容--->一个舞台
public void init(String stageName,String fxmlPath,int width,int height) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/"+fxmlPath));
Pane pane=null;
try {
pane = loader.load();
//fxmlPath 里面设置fx:controller设置的对象??
StageInterface stageInterface = loader.getController();
stageInterface.setStageManager(this);
} catch (IOException e) {
e.printStackTrace();
return;
}
Scene scene = new Scene(pane, width,height);
Stage stage = new Stage();
stage.setScene(scene);
addStage(stageName, stage);
}
}
StageInterface.java
package com.neu.im.utils;
public interface StageInterface {
void setStageManager(StageManager stageManager);
}
使用
Main.java
public class Main extends Application {
StageManager stageManager = new StageManager();
public final static String LOGIN_VIEW="loginView";
public final static String LOGIN_VIEW_FXML="LoginView.fxml";
public final static String INDEX_VIEW="indexView";
public final static String INDEX_VIEW_FXML="IndexView.fxml";
@Override
public void start(Stage primaryStage) {
//根据FXML自动初始化舞台
stageManager.init(LOGIN_VIEW,LOGIN_VIEW_FXML, 400, 400);
stageManager.init(INDEX_VIEW,INDEX_VIEW_FXML, 400, 400);
//显示登陆界面
stageManager.showStage(LOGIN_VIEW);
}
public static void main(String[] args) {
launch(args);
}
}
LoginController.java
package com.neu.im.controller;
import java.net.Socket;
import java.net.URL;
import java.time.chrono.MinguoChronology;
import java.util.ResourceBundle;
import com.neu.im.Main;
import com.neu.im.utils.StageInterface;
import com.neu.im.utils.StageManager;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
public class LoginController implements Initializable, EventHandler<ActionEvent>,StageInterface{
//舞台管理器
private StageManager stageManager;
//获取登录按钮
@FXML //从FXML中获取控件,根据字段名作为id查找
private Button loginBtn;
@FXML
private TextField nameTF;
@FXML
private TextField passwordTF;
private Socket socket;
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
loginBtn.setOnAction(this);
}
@Override
public void handle(ActionEvent actionEvent) {
String name = nameTF.getText();
String password = passwordTF.getText();
stageManager.toggleStage( Main.INDEX_VIEW,Main.LOGIN_VIEW);
}
@Override
public void setStageManager(StageManager stageManager) {
this.stageManager = stageManager;
}
}
TableView
含义
表格控件
使用步骤
TableView
fmlx
//TODO
控制器
//找到TableView
//找到TableColumn
//定义一个字段【可观察的List,里面数据发生了删除、添加那么TableView可以观察到,然后更新】 TODO
private ObservableList<Student> studentData = FXCollections.observableArrayList();
//准备数据
//List<Student> studentList = Dao的方法
//将studentList 放到可观察的List中
//将可观察的数据给tableView【studentTable.setItems(studentData);】
//TODO
//列和对象的属性要做映射关系?【哪个列显示对象的哪个属性】
idColumn.setCellValueFactory(cellData -> cellData.getValue().getId());
//注意点:这里对象的属性必须都是可观察的。--->改造Student实体类,将属性全部变成可观察的