Java实战之管家婆记账系统(16)——条形图展示数据界面及功能实现

本节概要

本节主要讲使用条形图展示数据。

 

前期准备

由于从本节开始就会用到JavaFX的图表,所以在tools包下创建了ChartTools.java,该类集中了本项目所需要用到创建条形图、折线图及饼图的相关方法,这些方法都是自定义的,不过也可以修改作它用,更多关于JavaFX图表的用法可以参考JavaFX的中文官网。

故ChartTools.java内容如下:

package AccountSystem.tools;
​
import AccountSystem.bean.Session;
import AccountSystem.bean.User;
import AccountSystem.dao.RecordDao;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.chart.*;
​
import java.util.Calendar;
import java.util.Date;
import java.util.List;
​
public class ChartTools {
    private DateTools dateTools = new DateTools();
​
    /**
     * 操作结果:设置条形图的数据根据给定的月数
     *
     * @param month        给定的月数
     * @param barChart     条形图
     * @param categoryAxis X轴
     * @param numberAxis   Y轴
     */
    public void public_setMonthBarChartData(int month,
                                            BarChart<?, ?> barChart,
                                            CategoryAxis categoryAxis,
                                            NumberAxis numberAxis) {
        // 实例化RecordDao对象
        RecordDao recordDao = new RecordDao();
        // 设置条形图水平轴的标签名称
        categoryAxis.setLabel("日期");
        // 设置条形图垂直轴的标签名称
        numberAxis.setLabel("金额");
        // 表示“收入”类型
        XYChart.Series monthInputSeries = new XYChart.Series();
        // 并设置该类型的名称
        monthInputSeries.setName("收入");
        // 表示“支出”类型
        XYChart.Series monthOutputSeries = new XYChart.Series();
        // 并设置该类型的名称
        monthOutputSeries.setName("支出");
​
        // 清空集合日期标签中的内容
        categoryAxis.getCategories().clear();
        // 循环月数,填充数据
        for (int i = 0; i < month; i++) {
            // 得到一个Calendar日历对象
            Calendar calendar = Calendar.getInstance();
            // 设置时间
            calendar.setTime(new Date());
            calendar.add(calendar.MONDAY, -i);
            Date monthDate = calendar.getTime();
            // 将monthDate进行格式化处理获取“yyyy-MM-dd”格式
            String monthStringDate = dateTools.dateFormat(monthDate, "yyyy-MM-dd");
            // 拼接SQL语句,获取当前日期的收入总额
            String monthInputsql = "select SUM(rMoney) from tb_records where rType='收入' and MONTH(rDate)= MONTH('" + monthStringDate + "') and uId=" + Session.getUser().getUserId() + ";";
            // 拼接SQL语句,获取当前日期的支出总额
            String monthOutputsql = "select SUM(rMoney) from tb_records where rType='支出' and MONTH(rDate)= MONTH('" + monthStringDate + "') and uId=" + Session.getUser().getUserId() + ";";
            // 执行收入SQL语句查询得到收入总额
            float monthInput = recordDao.getResultValueBySql(monthInputsql);
            // 执行支出SQL语句查询得到支出总额
            float monthOutput = recordDao.getResultValueBySql(monthOutputsql);
            // 为水平轴添加时间标签
            categoryAxis.getCategories().add(monthStringDate);
            // 填充“收入”类型的数据
            monthInputSeries.getData().add(new XYChart.Data<>(dateTools.dateFormat(dateTools.stringToDate(monthStringDate, "yyyy-MM-dd"), "yyyy-MM"), monthInput));
            // 填充“支出”类型的数据
            monthOutputSeries.getData().add(new XYChart.Data<>(dateTools.dateFormat(dateTools.stringToDate(monthStringDate, "yyyy-MM-dd"), "yyyy-MM"), monthOutput));
        }
​
        // 清除条形图上的所有数据
        barChart.getData().clear();
        // 重新填充条形图上的数据
        barChart.getData().addAll(monthInputSeries, monthOutputSeries);
    }
​
    /**
     * 操作结果:设置条形图的数据根据一年(四季度)
     *
     * @param barChart     条形图
     * @param categoryAxis X轴
     * @param numberAxis   Y轴
     */
    public void public_setSeasonBarChartData(BarChart<?, ?> barChart,
                                             CategoryAxis categoryAxis,
                                             NumberAxis numberAxis) {
        // 设置条形图水平轴的标签
        categoryAxis.setLabel("日期");
        // 设置条形图垂直轴的标签
        numberAxis.setLabel("金额");
        // 设置条形图“收入”类型
        XYChart.Series seasonInputSeries = new XYChart.Series();
        // 设置条形图“收入”类型的名称
        seasonInputSeries.setName("收入");
        // 设置条形图“支出”类型
        XYChart.Series seasonOutputSeries = new XYChart.Series();
        // 设置条形图“支出”类型的名称
        seasonOutputSeries.setName("支出");
​
        // 清空集合日期标签中的内容
        categoryAxis.getCategories().clear();
        // 获取一年四季度的所有开始日期和结束日期
        List<Date[]> list = dateTools.getYearQuarterList(new Date());
        // 循环遍历日期
        for (int i = 0; i < list.size(); i++) {
            // 将开始日期和结束日期格式化处理并拼接标签
            String strDate = dateTools.dateFormat(list.get(i)[0], "yyyy-MM-dd") + "-" + dateTools.dateFormat(list.get(i)[1], "yyyy" + "-MM-dd");
            // 为水平轴的每条数据添加标签
            categoryAxis.getCategories().add(strDate);
            // 获取一季度的收入总额
            String seasonInputSql = "select SUM(rMoney) from tb_records where rType='收入' and rDate between '" + dateTools.dateFormat(list.get(i)[0], "yyyy-MM-dd") + "' and '" + dateTools.dateFormat(list.get(i)[1], "yyyy-MM-dd") + "' and uId=" + Session.getUser().getUserId();
            // 获取一季度的支出总额
            String seasonOutpuSql = "select SUM(rMoney) from tb_records where rType='支出' and rDate between '" + dateTools.dateFormat(list.get(i)[0], "yyyy-MM-dd") + "' and '" + dateTools.dateFormat(list.get(i)[1], "yyyy-MM-dd") + "' and uId=" + Session.getUser().getUserId();
            // 执行一季度的收入总额的SQL语句获取收入总额
            float seasonInput = new RecordDao().getResultValueBySql(seasonInputSql);
            // 执行一季度的支出总额的SQL语句获取支出总额
            float seasonOutput = new RecordDao().getResultValueBySql(seasonOutpuSql);
            // 将数据填充到“收入”类型的条形图中
            seasonInputSeries.getData().add(new XYChart.Data<>(strDate, seasonInput));
            // 将数据填充到“支出”类型的条形图中
            seasonOutputSeries.getData().add(new XYChart.Data<>(strDate, seasonOutput));
        }
        // 清除条形图上的数据
        barChart.getData().clear();
        // 重新为条形图填充数据
        barChart.getData().addAll(seasonInputSeries, seasonOutputSeries);
    }
​
    /**
     * 操作结果:设置条形图的数据根据给定的天数
     *
     * @param day          给定的天数
     * @param barChart     条形图
     * @param categoryAxis X轴
     * @param numberAxis   Y轴
     */
    public void public_setBarChartData(int day, BarChart<?, ?> barChart,
                                       CategoryAxis categoryAxis,
                                       NumberAxis numberAxis) {
        // 设置水平轴的标签
        categoryAxis.setLabel("日期");
        // 设置垂直轴的标签
        numberAxis.setLabel("金额");
        // 实例化XYChart.Series对象添加收入数据
        XYChart.Series inputSeries = new XYChart.Series();
        // 设置名称
        inputSeries.setName("收入");
        // 实例化XYChart.Series对象添加支出数据
        XYChart.Series outputSeries = new XYChart.Series();
        // 设置名称
        outputSeries.setName("支出");
​
        // 清空集合日期标签中的内容
        categoryAxis.getCategories().clear();
        // 循环天数,绘制每一天的条形图
        for (int i = 0; i < day; i++) {
            // 获取日历对象
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -i);
            Date calendarTime = calendar.getTime();
            // 将日期格式化
            String date = dateTools.dateFormat(calendarTime, "yyyy-MM-dd");
            // 拼接每天的收入SQL语句
            String dateInputsql = "select SUM(rMoney) from tb_records where rType='收入' and rDate= '" + date + "' and " + " uId=" + Session.getUser().getUserId() + ";";
            // 拼接每天的支出SQL语句
            String dateOutputsql = "select SUM(rMoney) from tb_records where rType='支出' and rDate= '" + date + "' and " + " uId=" + Session.getUser().getUserId() + ";";
            // 执行SQL语句,获取每天的收入总额
            float dateInput = new RecordDao().getResultValueBySql(dateInputsql);
            // 执行SQL语句,获取每天的支出总额
            float dateOutput = new RecordDao().getResultValueBySql(dateOutputsql);
            // 为水平轴添加每天的日期标签
            categoryAxis.getCategories().add(date);
            // 将收入数据添加到收入条形图
            inputSeries.getData().add(new XYChart.Data<>(date, dateInput));
            // 将支出数据添加到支出条形图
            outputSeries.getData().add(new XYChart.Data<>(date, dateOutput));
        }
​
        // 清空条形图上的数据
        barChart.getData().clear();
        // 重新填充条形图上的数据
        barChart.getData().addAll(inputSeries, outputSeries);
    }
​
    /**
     * 操作结果:设置折线图的数据根据给定的天数
     *
     * @param day       给定的天数
     * @param lineChart 折线图
     */
    public void public_setDayLineChartData(int day, LineChart<?, ?> lineChart,
                                           CategoryAxis categoryAxis,
                                           NumberAxis numberAxis) {
        // 设置水平轴的标签
        categoryAxis.setLabel("日期");
        // 设置垂直轴的标签
        numberAxis.setLabel("金额");
​
        // 实例化XYChart.Series对象添加收入数据
        XYChart.Series inputSeries = new XYChart.Series();
        // 设置收入名称
        inputSeries.setName("收入");
        // 实例化XYChart.Series对象添加支出数据
        XYChart.Series outputSeries = new XYChart.Series();
        // 设置支出名称
        outputSeries.setName("支出");
​
        // 清空集合日期标签中的内容
        categoryAxis.getCategories().clear();
        // 循环天数,填充数据
        for (int i = 0; i < day; i++) {
            // 得到日历对象
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -i);
            Date calendarTime = calendar.getTime();
            // 将日期格式化
            String date = dateTools.dateFormat(calendarTime, "yyyy-MM-dd");
            // 拼接每天收入总额的SQL语句
            String dateInputsql = "select SUM(rMoney) from tb_records where rType='收入' and rDate= '" + date + "' and uId=" + Session.getUser().getUserId() + ";";
            // 拼接每天支出总额的SQL语句
            String dateOutputsql = "select SUM(rMoney) from tb_records where rType='支出' and rDate= '" + date + "' and uId=" + Session.getUser().getUserId() + ";";
            // 执行SQL语句获取每天收入总额
            float dateInput = new RecordDao().getResultValueBySql(dateInputsql);
            // 执行SQL语句获取每天支出总额
            Object dateOutput = new RecordDao().getResultValueBySql(dateOutputsql);
            // 添加收入数据
            inputSeries.getData().add(new XYChart.Data<>(date, dateInput));
            // 添加支出数据
            outputSeries.getData().add(new XYChart.Data<>(date, dateOutput));
        }
​
        // 清空折线图上的数据
        lineChart.getData().clear();
        // 重新为折线图填充数据
        lineChart.getData().addAll(inputSeries, outputSeries);
    }
​
    /**
     * 操作结果:设置折线图的数据根据给定的月数
     *
     * @param month     给定的月数
     * @param lineChart 折线图
     */
    public void public_setMonthLineChartData(int month, LineChart lineChart, CategoryAxis categoryAxis,
                                             NumberAxis numberAxis) {
        categoryAxis.setLabel("日期");
        numberAxis.setLabel("金额");
​
        XYChart.Series monthInputSeries = new XYChart.Series();
        monthInputSeries.setName("收入");
​
        XYChart.Series monthOutputSeries = new XYChart.Series();
        monthOutputSeries.setName("支出");
​
        // 清空集合日期标签中的内容
        categoryAxis.getCategories().clear();
        for (int i = 0; i < month; i++) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(new Date());
            calendar.add(calendar.MONDAY, -i);
            Date monthDate = calendar.getTime();
            String monthStringDate = dateTools.dateFormat(monthDate, "yyyy-MM-dd");
            String monthInputsql = "select SUM(rMoney) from tb_records where rType='收入' and MONTH(rDate)= MONTH('" + monthStringDate + "') and uId=" + Session.getUser().getUserId() + ";";
            String monthOutputsql = "select SUM(rMoney) from tb_records where rType='支出' and MONTH(rDate)= MONTH('" + monthStringDate + "') and uId=" + Session.getUser().getUserId() + ";";
            float monthInput = new RecordDao().getResultValueBySql(monthInputsql);
            float monthOutput = new RecordDao().getResultValueBySql(monthOutputsql);
            monthInputSeries.getData().add(new XYChart.Data<>(dateTools.dateFormat(monthDate, "yyyy-MM"), monthInput));
            monthOutputSeries.getData().add(new XYChart.Data<>(dateTools.dateFormat(monthDate, "yyyy-MM"), monthOutput));
        }
​
        lineChart.getData().clear();
        lineChart.getData().addAll(monthInputSeries, monthOutputSeries);
    }
​
    /**
     * 操作结果:设置折线图的数据根据给定的年(四个季度)
     *
     * @param lineChart    折线图
     * @param categoryAxis X轴
     * @param numberAxis   Y轴
     */
    public void public_setSeasonLineChartData(LineChart lineChart, CategoryAxis categoryAxis,
                                              NumberAxis numberAxis) {
        categoryAxis.setLabel("日期");
        numberAxis.setLabel("金额");
        XYChart.Series seasonInputSeries = new XYChart.Series();
        seasonInputSeries.setName("收入");
​
        XYChart.Series seasonOutputSeries = new XYChart.Series();
        seasonOutputSeries.setName("支出");
​
        // 清空集合日期标签中的内容
        categoryAxis.getCategories().clear();
        List<Date[]> list = dateTools.getYearQuarterList(new Date());
        for (int i = 0; i < list.size(); i++) {
            String strDate = dateTools.dateFormat(list.get(i)[0], "yyyy-MM-dd") + "-" + dateTools.dateFormat(list.get(i)[1], "yyyy-MM-dd");
            categoryAxis.getCategories().add(strDate);
            String seasonInputSql = "select SUM(rMoney) from tb_records where rType='收入' and rDate between '" + dateTools.dateFormat(list.get(i)[0], "yyyy-MM-dd") + "' and '" + dateTools.dateFormat(list.get(i)[1], "yyyy-MM-dd") + "' and uId=" + Session.getUser().getUserId();
            String seasonOutputSql = "select SUM(rMoney) from tb_records where rType='支出' and rDate between '" + dateTools.dateFormat(list.get(i)[0], "yyyy-MM-dd") + "' and '" + dateTools.dateFormat(list.get(i)[1], "yyyy-MM-dd") + "' and uId=" + Session.getUser().getUserId();
            float seasonInput = new RecordDao().getResultValueBySql(seasonInputSql);
            float seasonOutput = new RecordDao().getResultValueBySql(seasonOutputSql);
            seasonInputSeries.getData().add(new XYChart.Data<>(strDate, seasonInput));
            seasonOutputSeries.getData().add(new XYChart.Data<>(strDate, seasonOutput));
        }
        lineChart.getData().clear();
        lineChart.getData().addAll(seasonInputSeries, seasonOutputSeries);
    }
​
    /**
     * 操作结果:设置饼图的数据根据起始日期和终止日期
     *
     * @param user      用户对象
     * @param pieChart  饼图
     * @param startDate 起止日期
     * @param endDate   终止日期
     */
    public void public_setDayPieChartData(User user, PieChart pieChart, Date startDate, Date endDate) {
        // 将开始日期格式化处理
        String thisStartDate = dateTools.dateFormat(startDate, "yyyy-MM-dd");
        // 将结束日期格式化处理
        String thisEndDate = dateTools.dateFormat(endDate, "yyyy-MM-dd");
        // 拼接收入总额SQL语句
        String thisInputsql = "select SUM(rMoney) from tb_records where rType='收入' and rDate between '" + thisStartDate + "'" + " " + "and " + "'" + thisEndDate + "' and uId=" + user.getUserId() + ";";
        // 拼接支出总额SQL语句
        String thisOutputsql = "select SUM(rMoney) from tb_records where rType='支出' and rDate between '" + thisStartDate + "'" + " " + "and " + "'" + thisEndDate + "' and uId=" + user.getUserId() + ";";
        // 执行SQL语句获取收入总额
        float thisInput = new RecordDao().getResultValueBySql(thisInputsql);
        // 执行SQL语句获取支出总额
        float thisOutput = new RecordDao().getResultValueBySql(thisOutputsql);
        // 填充数据到ObservableList集合中
        ObservableList observableList = FXCollections.observableArrayList(
                new PieChart.Data("收入", thisInput),
                new PieChart.Data("支出", thisOutput)
        );
​
        // 顺时针设置饼图的切片
        pieChart.setClockwise(true);
        // 方法设置标签行的长度
        pieChart.setLabelLineLength(50);
        // 将饼图的标签设置为可见
        pieChart.setLabelsVisible(true);
        // 设置饼图的起始角度
        pieChart.setStartAngle(180);
​
        // 清空饼图的数据
        pieChart.getData().clear();
        // 填充数据集合到饼图中
        pieChart.setData(observableList);
    }
​
    /**
     * 操作结果:设置饼图的数据根据给定的天数
     *
     * @param user     用户对象
     * @param day      给定的天数
     * @param pieChart 饼图
     * @param type     账目类型,收入或支出
     */
    public void public_setWeekPieChartData(User user, int day, PieChart pieChart, String type) {
        // 实例化RecordDao对象
        RecordDao recordDao = new RecordDao();
        // 创建ObservableList集合
        ObservableList observableList = FXCollections.observableArrayList();
        // 循环遍历天数
        for (int i = 0; i < day; i++) {
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -i);
            Date calendarTime = calendar.getTime();
            String date = dateTools.dateFormat(calendarTime, "yyyy-MM-dd");
            String dateInputsql = "select SUM(rMoney) from tb_records where rType='" + type + "' and rDate= '" + date + "' and " + "uId=" + user.getUserId() + ";";
            float dateInput = recordDao.getResultValueBySql(dateInputsql);
            observableList.add(new PieChart.Data(date, dateInput));
        }
​
        // 设置饼图的标题
        pieChart.setTitle("饼图");
        // 顺时针设置饼图的切片
        pieChart.setClockwise(true);
        // 方法设置标签行的长度
        pieChart.setLabelLineLength(50);
        // 将饼图的标签设置为可见
        pieChart.setLabelsVisible(true);
        // 设置饼图的起始角度
        pieChart.setStartAngle(180);
​
        pieChart.getData().clear();
        pieChart.setData(observableList);
    }
​
    /**
     * 操作结果:设置饼图的数据根据给定的月数
     *
     * @param month    给定的月数
     * @param pieChart 饼图
     * @param type     指定账目类型,收入或支出
     */
    public void public_setMonthPieChartData(User user, int month, PieChart pieChart, String type) {
        // 实例化RecordDao对象
        RecordDao recordDao = new RecordDao();
        // 获取ObservableList集合对象
        ObservableList observableList = FXCollections.observableArrayList();
        for (int i = 0; i < month; i++) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(new Date());
            calendar.add(calendar.MONDAY, -i);
            Date monthDate = calendar.getTime();
            String monthStringDate = dateTools.dateFormat(monthDate, "yyyy-MM");
            String monthsql = "select SUM(rMoney) from tb_records where rType='" + type + "' and MONTH(rDate)= MONTH" + "('" + dateTools.dateFormat(monthDate, "yyyy-MM-dd") + "') and uId=" + user.getUserId() + ";";
            Object monthResult = recordDao.getResultValueBySql(monthsql);
            observableList.add(new PieChart.Data(monthStringDate, (Float) monthResult));
        }
​
        // 设置饼图的标题
        pieChart.setTitle("饼图");
        // 顺时针设置饼图的切片
        pieChart.setClockwise(true);
        // 方法设置标签行的长度
        pieChart.setLabelLineLength(50);
        // 将饼图的标签设置为可见
        pieChart.setLabelsVisible(true);
        // 设置饼图的起始角度
        pieChart.setStartAngle(180);
​
        pieChart.getData().clear();
        pieChart.setData(observableList);
    }
​
    /**
     * 操作结果:设置饼图的数据根据季度
     *
     * @param pieChart 饼图
     * @param type     指定类型
     */
    public void public_setSeasonPieChartData(User user, PieChart pieChart, String type) {
        ObservableList observableList = FXCollections.observableArrayList();
        List<Date[]> list = dateTools.getYearQuarterList(new Date());
        for (int i = 0; i < list.size(); i++) {
            String strDate = dateTools.dateFormat(list.get(i)[0], "yyyy-MM-dd") + "-" + dateTools.dateFormat(list.get(i)[1], "yyyy-MM-dd");
            String seasonSql = "select SUM(rMoney) from tb_records where rType='" + type + "' and rDate between '" + dateTools.dateFormat(list.get(i)[0], "yyyy-MM-dd") + "' and '" + dateTools.dateFormat(list.get(i)[1], "yyyy-MM-dd") + "' and uId=" + user.getUserId() + ";";
            Object season = new RecordDao().getResultValueBySql(seasonSql);
            observableList.add(new PieChart.Data(strDate, (Float) season));
        }
​
        // 设置饼图的标题
        pieChart.setTitle("饼图");
        // 顺时针设置饼图的切片
        pieChart.setClockwise(true);
        // 方法设置标签行的长度
        pieChart.setLabelLineLength(50);
        // 将饼图的标签设置为可见
        pieChart.setLabelsVisible(true);
        // 设置饼图的起始角度
        pieChart.setStartAngle(180);
​
        pieChart.getData().clear();
        pieChart.getData().addAll(observableList);
    }
}

创建界面

创建条形图显示界面,在view包下新建barChartFrame.fxml文件,使用Scene Builder设计界面,各个控件的属性和事件方法参考下面的代码:

<?xml version="1.0" encoding="UTF-8"?>
​
<?import javafx.scene.chart.BarChart?>
<?import javafx.scene.chart.CategoryAxis?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<AnchorPane prefHeight="800.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
            fx:controller="AccountSystem.controller.BarChartFrameController">
    <children>
        <HBox alignment="CENTER" prefHeight="68.0" prefWidth="800.0">
            <children>
                <ComboBox fx:id="barChart_comboBox" onAction="#barChart_comboBoxEvent" promptText="请选择日期"/>
            </children>
        </HBox>
        <ScrollPane fitToHeight="true" fitToWidth="true" layoutY="74.0" prefHeight="725.0" prefWidth="800.0">
            <content>
                <BarChart fx:id="barChart" prefHeight="727.0" prefWidth="799.0">
                    <xAxis>
                        <CategoryAxis fx:id="categoryAxis" side="BOTTOM"/>
                    </xAxis>
                    <yAxis>
                        <NumberAxis fx:id="numberAxis" side="LEFT"/>
                    </yAxis>
                </BarChart>
            </content>
        </ScrollPane>
    </children>
</AnchorPane>

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

package AccountSystem.controller;
​
import AccountSystem.tools.ChartTools;
import AccountSystem.tools.PublicTools;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.control.ComboBox;
​
import java.util.Calendar;
​
/**
 * 条形图界面控制器
 *
 * @author lck100
 */
public class BarChartFrameController {
    private ChartTools chartTools = new ChartTools();
    private PublicTools publicTools = new PublicTools();
​
    @FXML
    private CategoryAxis categoryAxis;
​
    @FXML
    private BarChart<?, ?> barChart;
​
    @FXML
    private ComboBox<?> barChart_comboBox;
​
    @FXML
    private NumberAxis numberAxis;
​
​
    /**
     * 下拉列表框事件处理
     *
     * @param event 事件
     */
    public void barChart_comboBoxEvent(ActionEvent event) {
       
    }
}

再接着就是这一FXML资源文件啊,所以继续在MainApp.java中写加载方法:

    /**
     * 操作结果:“条形图”查询结果界面
     */
    public Scene initBarChart() {
        try {
            Parent page = FXMLLoader.load(getClass().getResource("view/barChartFrame.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;
    }

最后是在菜单项中进行调用在MainPageController.java类中:

    /**
     * ”条形图“菜单项的事件监听器
     *
     * @param actionEvent 事件
     */
    @FXML
    public void barChartMenuItemEvent(ActionEvent actionEvent) {
        // 打开条形图界面
        mainApp.initBarChart();
    }

运行程序,查看界面:

 

实现功能

要实现通过下拉列表框来选择不同的选项来绘制不同的条形图,所以首先要为下拉列表框填充选项,接着为下拉列表框选项注册事件监听器,即选中的不同的日期就绘制不同的条形图。

即初始化下拉列表框选项的代码如下:

    /**
     * 初始化界面
     */
    public void initialize() {
        // 初始化填充下拉列表框选项
        String[] items = new String[]{"今天", "昨天", "最近3天", "最近7天", "最近30天", "最近1年(12月)", "最近1年(4季度)"};
        publicTools.public_addComboBoxItems(barChart_comboBox, items);
    }

运行查看即是:

接着是监听下拉列表框选项的事件:

    /**
     * 下拉列表框事件处理
     *
     * @param event 事件
     */
    public void barChart_comboBoxEvent(ActionEvent event) {
        // 获取下拉列表框选中项
        String selectedCoboboxItem = (String) barChart_comboBox.getSelectionModel().selectedItemProperty().getValue();
        // 对下拉列表框选中项进行处理
        switch (selectedCoboboxItem) {
            case "今天":
                chartTools.public_setBarChartData(1, barChart, categoryAxis, numberAxis);
                break;
            case "昨天":
                chartTools.public_setBarChartData(2, barChart, categoryAxis, numberAxis);
                break;
            case "最近3天":
                chartTools.public_setBarChartData(3, barChart, categoryAxis, numberAxis);
                break;
            case "最近7天":
                chartTools.public_setBarChartData(7, barChart, categoryAxis, numberAxis);
                break;
            case "最近30天":
                chartTools.public_setBarChartData(30, barChart, categoryAxis, numberAxis);
                break;
            case "最近1年(12月)":
                Calendar calendar = Calendar.getInstance();
                int month = calendar.get(Calendar.MONDAY) + 1;
                chartTools.public_setMonthBarChartData(month, barChart, categoryAxis, numberAxis);
                break;
            case "最近1年(4季度)":
                chartTools.public_setSeasonBarChartData(barChart, categoryAxis, numberAxis);
                break;
            default:
                break;
        }
    }

可以看到上面的代码很简洁,因为都是调用了ChartTools.java类中的方法,这些方法都是自定义封装的,这些代码才是核心的,所以如果要想绘制条形图需要去看该类中的代码,每一个方法都有注释说明,如果是更详细的教程还是要参照官网学习。

运行代码测试功能:

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值