Java实战之管家婆记账系统(14)——按分类条件查询界面及功能实现

本节概要

本节主要讲条件查询之按照分类进行条件查询,用户只需要选择收入和支出分类即可进行查询。

 

创建界面

单独创建一个界面来实现条件查询的功能,首先在view包下创建一个名为classificationCheckFrame.fxml的视图文件,使用Scene Builder设计需要的界面,各个控件的属性和事件方法参考下面的代码:

<?xml version="1.0" encoding="UTF-8"?>
​
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane prefHeight="600.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
            fx:controller="AccountSystem.controller.ClassificationCheckFrameController">
    <children>
        <TabPane prefHeight="600.0" prefWidth="600.0" tabClosingPolicy="UNAVAILABLE">
            <tabs>
                <Tab text="收入">
                    <content>
                        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
                            <children>
                                <TableView fx:id="input_classification_tableView" layoutY="86.0" prefHeight="500.0"
                                           prefWidth="600.0">
                                    <columns>
                                        <TableColumn fx:id="classification_idColumn" prefWidth="60.0" text="序号"/>
                                        <TableColumn fx:id="classification_typeColumn" prefWidth="71.0" text="类型"/>
                                        <TableColumn fx:id="classification_moneyColumn" prefWidth="63.0" text="金额"/>
                                        <TableColumn fx:id="classification_classificationColumn" prefWidth="108.0"
                                                     text="分类"/>
                                        <TableColumn fx:id="classification_memoColumn" prefWidth="161.0" text="备注"/>
                                        <TableColumn fx:id="classification_dateColumn" prefWidth="125.0" text="日期"/>
                                    </columns>
                                </TableView>
                                <HBox alignment="CENTER" layoutY="71.0" prefHeight="20.0" prefWidth="600.0">
                                    <children>
                                        <Separator prefHeight="20.0" prefWidth="602.0"/>
                                    </children>
                                </HBox>
                                <HBox alignment="CENTER" prefHeight="80.0" prefWidth="600.0" spacing="50.0">
                                    <children>
                                        <Label text="请选择分类:"/>
                                        <ComboBox fx:id="inputClassificationComboBox"
                                                  onAction="#inputClassificationComboBoxEvent" prefWidth="200.0"
                                                  promptText="请选择收入分类:"/>
                                    </children>
                                </HBox>
                            </children>
                        </AnchorPane>
                    </content>
                </Tab>
                <Tab text="支出">
                    <content>
                        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
                            <children>
                                <TableView fx:id="output_classification_tableView" editable="true" layoutY="86.0"
                                           prefHeight="500.0" prefWidth="600.0" tableMenuButtonVisible="true">
                                    <columns>
                                        <TableColumn fx:id="classification_idColumn2" prefWidth="60.0" text="序号"/>
                                        <TableColumn fx:id="classification_typeColumn2" prefWidth="71.0" text="类型"/>
                                        <TableColumn fx:id="classification_moneyColumn2" prefWidth="63.0" text="金额"/>
                                        <TableColumn fx:id="classification_classificationColumn2" prefWidth="105.0"
                                                     text="分类"/>
                                        <TableColumn fx:id="classification_memoColumn2" prefWidth="164.0" text="备注"/>
                                        <TableColumn fx:id="classification_dateColumn2" prefWidth="125.0" text="日期"/>
                                    </columns>
                                </TableView>
                                <HBox alignment="CENTER" layoutY="71.0" prefHeight="20.0" prefWidth="600.0">
                                    <children>
                                        <Separator prefHeight="20.0" prefWidth="602.0"/>
                                    </children>
                                </HBox>
                                <HBox alignment="CENTER" prefHeight="80.0" prefWidth="600.0" spacing="50.0">
                                    <children>
                                        <Label text="请选择分类:"/>
                                        <ComboBox fx:id="outputClassificationComboBox"
                                                  onAction="#outputClassificationComboBoxEvent" prefHeight="30.0"
                                                  prefWidth="200.0" promptText="请选择支出分类:"/>
                                    </children>
                                </HBox>
                            </children>
                        </AnchorPane>
                    </content>
                </Tab>
            </tabs>
        </TabPane>
    </children>
</AnchorPane>

接着在controller包下创建与之对应的控制器类ClassificationCheckFrameController.java,从Scene Builder中复制该界面的组件对象和事件方法代码到该类中:

package AccountSystem.controller;
​
import AccountSystem.bean.Classification;
import AccountSystem.bean.Session;
import AccountSystem.bean.TableData;
import AccountSystem.dao.ClassificationDao;
import AccountSystem.tools.PublicTools;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
​
import java.util.List;
​
/**
 * 按分类条件查询界面控制器
 *
 * @author lck100
 */
public class ClassificationCheckFrameController {
    private PublicTools publicTools = new PublicTools();
​
    @FXML
    private TableView<TableData> input_classification_tableView;
​
    @FXML
    private TableColumn<TableData, String> classification_idColumn;
​
    @FXML
    private TableColumn<TableData, String> classification_memoColumn2;
​
    @FXML
    private TableColumn<TableData, String> classification_dateColumn2;
​
    @FXML
    private ComboBox<?> outputClassificationComboBox;
​
    @FXML
    private TableColumn<TableData, String> classification_typeColumn2;
​
    @FXML
    private TableView<TableData> output_classification_tableView;
​
    @FXML
    private TableColumn<TableData, String> classification_idColumn2;
​
    @FXML
    private TableColumn<TableData, String> classification_typeColumn;
​
    @FXML
    private TableColumn<TableData, String> classification_classificationColumn;
​
    @FXML
    private TableColumn<TableData, String> classification_memoColumn;
​
    @FXML
    private ComboBox<?> inputClassificationComboBox;
​
    @FXML
    private TableColumn<TableData, String> classification_moneyColumn2;
​
    @FXML
    private TableColumn<TableData, String> classification_classificationColumn2;
​
    @FXML
    private TableColumn<TableData, String> classification_moneyColumn;
​
    @FXML
    private TableColumn<TableData, String> classification_dateColumn;
​
    /**
     * ”支出“选项卡中的下拉菜单的事件方法
     *
     * @param event 事件
     */
    public void outputClassificationComboBoxEvent(ActionEvent event) {
        
    }
​
    /**
     * ”收入“选项卡中的下拉菜单的事件方法
     *
     * @param event 事件
     */
    public void inputClassificationComboBoxEvent(ActionEvent event) {
        
    }
​
}

再接着就是在MainApp中写方法加载FXML文件

    /**
     * 操作结果:”按分类查询“结果界面
     */
    public Scene initClassificationTableView() {
        try {
            Parent page = FXMLLoader.load(getClass().getResource("view/classificationCheckFrame.fxml"));
​
            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);
​
            mainFrameStage.showAndWait();
            return scene;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

最后是在按分类查询菜单项中调用该方法启动界面:

    /**
     * ”按分类查询“菜单项的事件监听器
     *
     * @param event 事件
     */
    @FXML
    public void classificationCheckMenuItemEvent(ActionEvent event) {
        // 打开按分类查询界面
        mainApp.initClassificationTableView();
    }

运行项目,打开分类查询界面:

 

实现功能

可以看到“按分类查询”界面有两个面板,一个是“收入”面板,另一个是“支出”面板,可以在下拉列表框中选择收入分类火支出分类来进行条件查询,查询结果将显示在下面的表格中。

首先在打开界面时就应该给下拉列表框填充供用户选择的选项,并且初始化显示所有的表格记录,分别在收入面板显示所有收入分类的记录,在支出面板显示所有支出分类的记录。

所以在ClassificationCheckFrameController.java中的initialize()方法实现:

    /**
     * 初始化界面
     */
    public void initialize() {
        // 获取收入分类的所有信息
        List<Classification> inputClassificationList = new ClassificationDao().selectByType("收入");
        // 实例化一个一维数组
        String[] inputClassificationNames = new String[inputClassificationList.size()];
        // 将查询得到的分类名称装到一维数组中
        for (int i = 0; i < inputClassificationList.size(); i++) {
            inputClassificationNames[i] = inputClassificationList.get(i).getcName();
        }
        // 将所有的收入分类添加到下拉列表框中
        publicTools.public_addComboBoxItems(inputClassificationComboBox, inputClassificationNames);
        // 拼接要查询的SQL语句
        String inputSql = "select * from tb_records where rType='收入' and uId=" + Session.getUser().getUserId() + ";";
        // 填充数据到表格控件中
        publicTools.public_initTableViewData(input_classification_tableView
                , publicTools.public_getTableViewData(inputSql)
                , classification_idColumn2
                , classification_typeColumn2
                , classification_moneyColumn2
                , classification_classificationColumn2
                , classification_memoColumn2
                , classification_dateColumn2);
​
        // 获取支出分类的所有信息
        List<Classification> outputClassificationList = new ClassificationDao().selectByType("支出");
        // 实例化一个一维数组
        String[] outputClassificationNames = new String[outputClassificationList.size()];
        // 将查询得到的分类名称装到一维数组中
        for (int i = 0; i < outputClassificationList.size(); i++) {
            outputClassificationNames[i] = outputClassificationList.get(i).getcName();
        }
        // 将所有的支出分类名称填充到下拉列表框中
        publicTools.public_addComboBoxItems(outputClassificationComboBox, outputClassificationNames);
        // 拼接要查询的SQL语句
        String outputSql =  "select * from tb_records where rType='支出' and uId=" + Session.getUser().getUserId() + ";";
        // 填充数据到表格控件中
        publicTools.public_initTableViewData(output_classification_tableView
                , publicTools.public_getTableViewData(outputSql)
                , classification_idColumn
                , classification_typeColumn
                , classification_moneyColumn
                , classification_classificationColumn
                , classification_memoColumn
                , classification_dateColumn);
    }

运行程序,将显示所有的记录:

可以在控制器类代码中看到有两个事件监听器,一个是“支出”选项卡的下拉列表框监听器,另一个是“收入”选项卡的下拉列表框监听器事件。

两个本质上都是一样的,不同的是查询的分类不一样而已。

获取用户在下拉列表框中所选择的分类名称,然后拼接SQL语句从数据库中查询数据并填充到表格控件中显示出来。

故两个事件监听器的代码如下:

    /**
     * ”支出“选项卡中的下拉菜单的事件方法
     *
     * @param event 事件
     */
    public void outputClassificationComboBoxEvent(ActionEvent event) {
        // 获取支出下拉列表框选中项
        String selectedCoboboxItem = (String) outputClassificationComboBox.getSelectionModel().selectedItemProperty().getValue();
        // 拼接要查询的SQL语句
        String sql = "select * from tb_records where rClassification='" + selectedCoboboxItem + "' and uId=" + Session.getUser().getUserId() + ";";
        // 填充数据到表格控件中
        publicTools.public_initTableViewData(output_classification_tableView
                , publicTools.public_getTableViewData(sql)
                , classification_idColumn
                , classification_typeColumn
                , classification_moneyColumn
                , classification_classificationColumn
                , classification_memoColumn
                , classification_dateColumn);
    }
​
    /**
     * ”收入“选项卡中的下拉菜单的事件方法
     *
     * @param event 事件
     */
    public void inputClassificationComboBoxEvent(ActionEvent event) {
        // 获取收入下拉列表框选中项
        String selectedCoboboxItem = (String) inputClassificationComboBox.getSelectionModel().selectedItemProperty().getValue();
        // 拼接SQL语句
        String sql = "select * from tb_records where rClassification='" + selectedCoboboxItem + "' and uId=" + Session.getUser().getUserId() + ";";
        // 填充数据到表格控件中
        publicTools.public_initTableViewData(input_classification_tableView
                , publicTools.public_getTableViewData(sql)
                , classification_idColumn2
                , classification_typeColumn2
                , classification_moneyColumn2
                , classification_classificationColumn2
                , classification_memoColumn2
                , classification_dateColumn2);
    }

运行程序,测试功能:

 

 

可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。

注意:在公众号后台回复【20200407】可获取本章的源码。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值