软件构造实验06 面向对象的软件构造

目录

一、前言

二、实验目的

三、实验内容


一、前言

软件构造的实验作业06,使用的编程语言为Java,绘制库为Jfree,JDK为Java 1.8。本文的源码均放在了博主的主页,自行下载。

二、实验目的

1、熟悉GUI软件构造的技术。

2.掌握Java中常用的GUI构件。

3.能将构造的软件打包并交付给用户使用。

三、实验内容

根据教材216-219构造9.1的代码,重构9.1部份代码,并扩充功能,完成构造9.2,构造成功之后,将最后生成的项目文件打包成JAR包提交给用户(模拟,不用真实提交给用户)。

打包过程在上一篇文章中有提及,这里不过多赘述,直接进入到GUI的设计。

GUI的构件部署技术使用到Jfree库,该库需要去官网自行下载,后在idea中导入即可,导入过程如下:

选择文件---->项目结构---->库,导入已经下载好的Jfree中的lib文件夹下的两个jar文件,如下图所示:

成功导入后的库界面如下:

MainGUI类

package exp7;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.*;
import exp3.Exercise;
import exp4.Answer;
import exp4.Check;

public class MainGUI extends JFrame {
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JPanel panelCenter, panelSouth;
    private JTextField tEquation[];
    private JTextField tAnswer[];
    private JButton preButton, nextButton;
    private JLabel pageIndex;
    private int equationCount;
    private int pages, currentPage;
    private Exercise exercise;
    private Answer answer;
    private JButton check;
    private JLabel labelResult;
    private final int PAGE_SIZE = 50;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainGUI frame = new MainGUI();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public MainGUI() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(200, 200, 650, 410);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        setTitle("算式练习程序");
        setBackground(Color.yellow);
        setResizable(false);
        init();
    }

    private void init() {
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        JMenu menuOnline = new JMenu("在线练习");
        menuBar.add(menuOnline);

        JMenuItem onlineAdd = new JMenuItem("加法");
        onlineAdd.setActionCommand("onlineAdd");
        menuOnline.add(onlineAdd);
        onlineAdd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                online(arg0);
            }
        });

        JMenuItem onlineSub = new JMenuItem("减法");
        onlineSub.setActionCommand("onlineSub");
        menuOnline.add(onlineSub);
        onlineSub.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                online(arg0);
            }
        });

        JMenuItem onlineMix = new JMenuItem("加减法混合");
        onlineMix.setActionCommand("onlineMix");
        menuOnline.add(onlineMix);
        onlineMix.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                online(arg0);
            }
        });

        JMenu menuOutline = new JMenu("批量习题");
        menuBar.add(menuOutline);

        JMenuItem outlineAdd = new JMenuItem("加法");
        outlineAdd.setActionCommand("outlineAdd");
        menuOutline.add(outlineAdd);
        outlineAdd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                online(arg0);
            }
        });

        JMenuItem outlineSub = new JMenuItem("减法");
        outlineSub.setActionCommand("outlineSub");
        menuOutline.add(outlineSub);
        outlineSub.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                online(arg0);
            }
        });

        JMenuItem outlineMix = new JMenuItem("加减法混合");
        outlineMix.setActionCommand("outlineMix");
        menuOutline.add(outlineMix);
        outlineMix.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                online(arg0);
            }
        });

        JMenu menuCheck = new JMenu("批改习题");
        menuBar.add(menuCheck);
        JMenuItem judge = new JMenuItem("批改习题");
        menuCheck.add(judge);
        judge.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });

        JMenu menuSave = new JMenu("保存习题");
        menuBar.add(menuSave);
        JMenuItem save = new JMenuItem("保存习题");
        menuSave.add(save);
        judge.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });

        JMenu menuClean = new JMenu("清空习题");
        menuBar.add(menuClean);
        JMenuItem clean = new JMenuItem("清空习题");
        menuClean.add(clean);
        judge.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });

        JMenu menuExit = new JMenu("退出程序");
        menuBar.add(menuExit);
        JMenuItem exit = new JMenuItem("退出程序");
        menuExit.add(exit);
        exit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
            }
        });

        panelCenter = new JPanel();
        panelSouth = new JPanel();
        FlowLayout flowLayout = (FlowLayout) panelSouth.getLayout();
        flowLayout.setAlignment(FlowLayout.LEFT);
        contentPane.add(BorderLayout.CENTER, panelCenter);
        contentPane.add(BorderLayout.SOUTH, panelSouth);

        tEquation = new JTextField[PAGE_SIZE];
        tAnswer = new JTextField[PAGE_SIZE];
        for (int i = 0; i < PAGE_SIZE; i++) {
            tEquation[i] = new JTextField(5);
            tEquation[i].setHorizontalAlignment(JTextField.RIGHT);
            tEquation[i].setBackground(panelCenter.getBackground());
            tEquation[i].setBorder(null);
            tEquation[i].setEditable(false);
            tAnswer[i] = new JTextField(5);
            panelCenter.add(tEquation[i]);
            panelCenter.add(tAnswer[i]);
            tEquation[i].setVisible(false);
            tAnswer[i].setVisible(false);
        }
        preButton = new JButton("前一页");
        preButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                prePage();
            }
        });

        nextButton = new JButton("后一页");
        nextButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                nextPage();
            }
        });
        panelCenter.add(preButton);
        pageIndex = new JLabel();
        panelCenter.add(pageIndex);
        panelCenter.add(nextButton);
        preButton.setVisible(false);
        nextButton.setVisible(false);

        check = new JButton("批改");
        check.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                check();
            }

        });
        labelResult = new JLabel();
        panelSouth.add(check);
        panelSouth.add(labelResult);
        check.setVisible(false);
        labelResult.setVisible(false);
    }

    public void online(ActionEvent arg0) {
        if (arg0.getActionCommand() == "onlineAdd") {
            equationCount = Integer.parseInt(JOptionPane.showInputDialog("请输入加法算式数量"));
            exercise = new Exercise(equationCount);
            exercise.generateAddExercise();
        } else if (arg0.getActionCommand() == "onlineSub") {
            equationCount = Integer.parseInt(JOptionPane.showInputDialog("请输入减法算式数量"));
            exercise = new Exercise(equationCount);
            exercise.generateSubExercise();
        } else if (arg0.getActionCommand() == "onlineMix") {
            equationCount = Integer.parseInt(JOptionPane.showInputDialog("请输入混合算式数量"));
            exercise = new Exercise(equationCount);
            exercise.generateExercise();
        }
        answer = new Answer();
        for (int i = 0; i < equationCount; i++) {
            answer.add(-1);
        }
        pages = (int) Math.ceil(equationCount * 1.0 / PAGE_SIZE);
        currentPage = 1;
        labelResult.setText("");
        update();
    }

    public void update() {
        for (int i = (currentPage - 1) * PAGE_SIZE, j = 0; i < currentPage * PAGE_SIZE; i++, j++) {
            if (i < equationCount) {
                tEquation[j].setText(exercise.get(i).toString2());
                tEquation[j].setBackground(panelCenter.getBackground());
                tEquation[j].setVisible(true);
                if (answer.get(i) != -1) {
                    tAnswer[j].setText(Integer.toString(answer.get(i)));
                } else {
                    tAnswer[j].setText("");
                }
                tAnswer[j].setVisible(true);
            } else {
                tEquation[j].setVisible(false);
                tAnswer[j].setVisible(false);
            }
        }
        preButton.setVisible(pages > 1);
        nextButton.setVisible(pages > 1);
        preButton.setEnabled(currentPage > 1);
        nextButton.setEnabled(currentPage < pages);
        pageIndex.setText(currentPage + " / " + pages);
        check.setVisible(true);
        labelResult.setVisible(true);
        if (currentPage == pages) {
            check.setEnabled(true);
        } else {
            check.setEnabled(false);
        }
    }

    public void prePage() {
        for (int i = (currentPage - 1) * PAGE_SIZE, j = 0; i < currentPage * PAGE_SIZE; i++, j++) {
            if (i < equationCount && tAnswer[j].getText() != null && tAnswer[j].getText().length() > 0) {
                if (tAnswer[j].getText().matches("^[0-9]*$")) {
                    answer.set(i, Integer.parseInt(tAnswer[j].getText()));
                }
            }
        }
        currentPage--;
        update();
    }

    public void nextPage() {
        for (int i = (currentPage - 1) * PAGE_SIZE, j = 0; i < currentPage * PAGE_SIZE; i++, j++) {
            if (i < equationCount && tAnswer[j].getText() != null && tAnswer[j].getText().length() > 0) {
                if (tAnswer[j].getText().matches("^[0-9]*$")) {
                    answer.set(i, Integer.parseInt(tAnswer[j].getText()));
                }
            }
        }
        currentPage++;
        update();
    }

    public void check() {
        for (int i = (currentPage - 1) * PAGE_SIZE, j = 0; i < currentPage * PAGE_SIZE; i++, j++) {
            if (i < equationCount && tAnswer[j].getText() != null && tAnswer[j].getText().length() > 0) {
                if (tAnswer[j].getText().matches("^[0-9]*$")) {
                    answer.set(i, Integer.parseInt(tAnswer[j].getText()));
                }
            }
        }
        Check ch = new Check();
        ch.check(exercise, answer);
        labelResult.setText("正确数量:" + ch.getRight() + "; 错误数量:" + ch.getWrong());
        drawPieChart(ch);
    }

    public void drawPieChart(Check check) {
        DefaultPieDataset dataset = new DefaultPieDataset();
        dataset.setValue("正确数量:" + check.getRight(), check.getRight());
        dataset.setValue("错误数量:" + check.getWrong(), check.getWrong());
        JFreeChart chart = ChartFactory.createPieChart("正确数量和错误数量饼图", (PieDataset) dataset, true, false, false);
        PiePlot plot = (PiePlot) chart.getPlot();
        chart.setBackgroundPaint(Color.yellow);
        plot.setForegroundAlpha(1.0f);
        plot.setCircular(true);
        Font font = new Font("黑体", Font.CENTER_BASELINE, 30);
        TextTitle title = chart.getTitle();
        title.setFont(font);
        chart.setTitle(title);
        ChartPanel cPanel = new ChartPanel(chart);
        JFrame result = new JFrame();
        result.setBounds(300, 300, 800, 600);
        result.add(cPanel);
        result.setVisible(true);
    }
}

 运行效果如下:

生成100道加减法混合运算,可实现在线练习,批改功能。

可以显示正确和错误的情况,以饼图的形式呈现。

 

都看到最后了,不点个赞吗? 

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值