Java实战之管家婆记账系统(11)——右键菜单实现刷新、增删改功能

本节概要

本节主要讲通过右键菜单来实现增删改查的功能。

 

刷新右键菜单

“刷新”右键菜单,点击后刷新界面所有数据,即调用初始化方法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】可获取本章的源码 。

 

<think>好的,我现在需要帮助用户解决如何在Dify中集成Ollama的问题。首先,我应该回顾用户提供的引用内容,看看有没有相关的步骤说明。根据引用[1]和引用[2],里面提到了安装本地插件配置模型等步骤。 用户的问题很明确,想知道如何在Dify添加配置Ollama。我需要按照逻辑分步骤回答,确保每一步都清晰。首先,可能需要提到安装Ollama插件,然后配置模型供应商,最后测试应用。 需要注意的是,用户可能已经安装好了DifyOllama,所以步骤可能从登录Dify开始。引用中提到访问本地主机的URL,比如http://localhost/apps,以及设置模型供应商。需要确认插件安装是通过Dify市场还是本地安装,引用里提到需要下载插件然后本地安装,所以步骤要包括这些。 另外,配置模型的时候需要填写Ollama的API地址,通常是本地的3000端口,用户可能需要确保Ollama服务正在运行。这部分可能需要提醒用户检查服务状态。 最后,创建聊天应用的步骤可能需要简要说明,让用户知道如何测试配置是否成功。同时,生成的相关问题需要考虑用户可能遇到的后续问题,比如插件安装失败怎么办,或者模型不显示的可能原因。 需要确保回答符合格式要求,使用中文,行内公式正确,引用标识放在适当的位置。同时,相关问题的生成要围绕集成过程中可能出现的疑问,帮助用户深入理解。</think>### 如何在 Dify 中集成 Ollama 以下是分步操作指南,基于引用内容整理[^1][^2]: 1. **安装 Ollama 本地插件** - 登录 Dify 后台,访问 `http://localhost/apps` 进入控制台 - 在右上角头像菜单选择「设置」→「模型供应商」 - 通过 Dify 市场搜索 "Ollama" 插件并下载(注意选择下载图标而非直接安装) 2. **加载本地插件** - 在插件管理界面点击「+安装插件」 - 选择「本地插件」选项 - 上传已下载的 Ollama 插件文件 3. **配置模型参数** ```python # 示例配置参数 { "base_url": "http://localhost:11434", # Ollama 默认端口 "model_name": "llama2", # 需与本地部署模型一致 "temperature": 0.7 } ``` - 在「模型供应商」设置页添加 Ollama - 填写 API 终结点地址(默认 `http://localhost:11434`) - 选择已下载的本地模型文件 4. **验证服务连通性** - 确保 Ollama 服务已启动(访问 `http://localhost:3000` 验证) - 在 Dify 的「模型测试」界面发送测试请求 - 检查响应日志确认模型加载状态 5. **创建应用(示例)** - 新建「聊天助手」类型应用 - 在模型选择器切换至已配置Ollama 模型 - 通过 Prompt 工程调整模型响应特性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值