目录
一、前言
软件构造的实验作业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道加减法混合运算,可实现在线练习,批改功能。
可以显示正确和错误的情况,以饼图的形式呈现。
都看到最后了,不点个赞吗?