本节概要
本节主要讲通过右键菜单来实现增删改查的功能。
刷新右键菜单
“刷新”右键菜单,点击后刷新界面所有数据,即调用初始化方法initialize()方法重新初始化一遍。
/**
* ”刷新“右键菜单的事件监听器
*
* @param actionEvent 事件
*/
public void refreshContextMenuEvent(ActionEvent actionEvent) {
// 刷新数据
initialize();
}
添加右键菜单
同样“添加”右键菜单也是最简单的,只需要在点击菜单项后跳转到添加界面即可。
/**
* “添加”右键菜单的事件监听器
*
* @param event 事件
*/
@FXML
public void addContextMenuEvent(ActionEvent event) {
// 跳转到添加界面即可
mainApp.initAddFrame();
}
删除右键菜单
“删除”右键菜单的事件处理,即获取被选中的表格行的数据,然后调用RecordDao.java中的deleteRecord()方法执行删除记录操作。
可以通过“tableView.getSelectionModel().getSelectedItem()”获取被选中行的数据。
/**
* “删除”右键菜单的事件监听器
*
* @param event 事件
*/
@FXML
public void deleteContextMenuEvent(ActionEvent event) {
// 给出提示框提示用户是否选择删除
boolean b = SimpleTools.informationDialog(Alert.AlertType.CONFIRMATION, "提示", "提示", "请问是否删除?");
if (b) {
RecordDao recordDao = new RecordDao();
// 获取所选择行的索引,从0开始
int selectedIndex = tableView.getSelectionModel().getSelectedIndex();
// 获取所选中行是数据
TableData td = tableView.getSelectionModel().getSelectedItem();
// 判断是否选中表格行
if (selectedIndex >= 0) {
// 删除选中的表格行根据索引
tableView.getItems().remove(selectedIndex);
// 执行删除操作
recordDao.deleteRecord(new Record(Integer.parseInt(td.getId())));
}
// 刷新表格数据
initialize();
}
}
修改右键菜单
“修改”右键菜单实现稍微难些,因为将选中表格行的数据传递到要修改的界面有些难度。
修改右键菜单事件处理代码如下:
/**
* “修改”右键菜单的事件监听器
*
* @param event 事件
*/
@FXML
public void alterContextMenuEvent(ActionEvent event) {
// 获取所选中行的数据
TableData td = tableView.getSelectionModel().getSelectedItem();
// 设置一个标志,判断是右键菜单触发的修改还是由菜单条上的菜单触发的修改
boolean isContextMenu = true;
mainApp.initAlterFrame(td, isContextMenu);
}
可以看到调用了initAlterFrame()方法,这个方法是加载alterAccountFrame.fxml文件的,在修改功能中实现过,不过是没有参数的,而这次修改了代码,使其具有了两个参数,第一个参数即是要修改的数据,第二个参数是Boolean类型的,用来判断该次修改是右键菜单触发还是由菜单条上的修改菜单触发的。
所以修改菜单的事件方法alterMenuItemEvent()代码也需要修改:
/**
* ”修改“菜单项的事件监听器
*
* @param actionEvent 事件
*/
@FXML
public void alterMenuItemEvent(ActionEvent actionEvent) {
// 刷新数据
initialize();
// 调用修改界面控制器
mainApp.initAlterFrame(null,false);
}
然后是MainApp.java中的initAlterFrame()方法修改为如下,通过这个方法来将要修改的数据传递到控制器中:
/**
* 操作结果:更改账目界面
*/
public Scene initAlterFrame(TableData tableData,boolean isContextMenu) {
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainApp.class.getResource("view/alterAccountFrame.fxml"));
AnchorPane page = (AnchorPane) loader.load();
Stage mainFrameStage = new Stage();
mainFrameStage.setTitle("更改账目");
mainFrameStage.setResizable(true);
mainFrameStage.setAlwaysOnTop(false);
mainFrameStage.initModality(Modality.APPLICATION_MODAL);
mainFrameStage.initOwner(primaryStage);
Scene scene = new Scene(page);
mainFrameStage.setScene(scene);
// 判断是否由右键菜单触发打开的修改界面,如果是就将要修改的数据传到修改界面
if(isContextMenu){
AlterAccountFrameController controller= loader.getController();
controller.setTableData(tableData);
}
mainFrameStage.showAndWait();
return scene;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
然后在AlterAccountFrameController.java中添加如下方法来设置要修改的数据:
/**
* 将右键菜单所触发的修改的数据传到修改界面
*
* @param tableData 要修改的数据
*/
public void setTableData(TableData tableData) {
// 使界面组件可编辑
inputRadioButton.setDisable(false);
outputRadioButton.setDisable(false);
moneyTextField.setDisable(false);
classificationComboBox.setDisable(false);
memoTextArea.setDisable(false);
datePickerText.setDisable(false);
alterButton.setDisable(false);
// 将要修改的数据填充到各个控件中
idTextField.setText(tableData.getId());
if (tableData.getType().equals("支出")) {
outputRadioButton.setSelected(true);
} else {
inputRadioButton.setSelected(true);
}
if (outputRadioButton.isSelected()) {
List<Classification> classificationList = new ClassificationDao().selectByType("支出");
// 实例化一个一维数组
String[] classificationNames = new String[classificationList.size()];
// 将查询得到的分类名称装到一维数组中
for (int i = 0; i < classificationList.size(); i++) {
classificationNames[i] = classificationList.get(i).getcName();
}
classificationComboBox.setItems(FXCollections.observableArrayList((List) Arrays.asList(classificationNames)));
}
if (inputRadioButton.isSelected()) {
List<Classification> classificationList = new ClassificationDao().selectByType("收入");
// 实例化一个一维数组
String[] classificationNames = new String[classificationList.size()];
// 将查询得到的分类名称装到一维数组中
for (int i = 0; i < classificationList.size(); i++) {
classificationNames[i] = classificationList.get(i).getcName();
}
classificationComboBox.setItems(FXCollections.observableArrayList((List) Arrays.asList(classificationNames)));
}
moneyTextField.setText(tableData.getMoney());
// 设置分类
String str = tableData.getClassification();
int index = 0;
if (tableData.getType().equals("支出")) {
List<Classification> classificationList = new ClassificationDao().selectByType("支出");
// 实例化一个一维数组
String[] classificationNames = new String[classificationList.size()];
// 将查询得到的分类名称装到一维数组中
for (int i = 0; i < classificationList.size(); i++) {
classificationNames[i] = classificationList.get(i).getcName();
}
List outputList = FXCollections.observableArrayList((List) Arrays.asList(classificationNames));
for (int i = 0; i < outputList.size(); i++) {
if (str.equals(outputList.get(i))) {
index = i;
}
}
//设置选中的分类
classificationComboBox.getSelectionModel().select(index);
}
if (tableData.getType().equals("收入")) {
List<Classification> classificationList = new ClassificationDao().selectByType("收入");
// 实例化一个一维数组
String[] classificationNames = new String[classificationList.size()];
// 将查询得到的分类名称装到一维数组中
for (int i = 0; i < classificationList.size(); i++) {
classificationNames[i] = classificationList.get(i).getcName();
}
List inputList = FXCollections.observableArrayList((List) Arrays.asList(classificationNames));
for (int i = 0; i < inputList.size(); i++) {
if (str.equals(inputList.get(i))) {
index = i;
}
}
// 设置选中的分类
classificationComboBox.getSelectionModel().select(index);
}
memoTextArea.setText(tableData.getMemo());
datePickerText.setValue(LocalDate.parse(tableData.getDate()));
}
运行程序,测试功能:
可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。
注意:在公众号后台回复【20200331】可获取本章的源码 。