- 论坛徽章:
- 1
|
学习java swing,写下的考试系统,主要功能就是在线答题,随机出题目。在线测试,保存题目。
MainFrame.java- package com.wang;
-
- import java.awt.BorderLayout;
- import java.awt.Container;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
-
- import javax.swing.JFrame;
- import javax.swing.JScrollPane;
- import javax.swing.JTextArea;
-
- import com.wang.ctrl.ArithmeticController;
- import com.wang.view.ButtonsPane;
- import com.wang.view.NorthPane;
-
- public class MainFrame extends JFrame {
-
- public MainFrame(String title){
- super(title);
- NorthPane north = new NorthPane();//添加北区面板
-
- JTextArea area = new JTextArea();//中间区域的面板用来存放所有题目答题者的对错情况,就是用来存放arithmetic
- area.setEditable(false);//这块区域不可以编辑
-
- String[] titles = {"开始","显示","保存","退出"};
- ButtonsPane buttonsPane = new ButtonsPane(4);//buttonspane用啦产生button的
- buttonsPane.setTitles(titles);
-
-
- ArithmeticController controller = new ArithmeticController(north,area,buttonsPane);
-
- Container c = this.getContentPane();
- c.add(north, BorderLayout.NORTH);
- c.add(new JScrollPane(area));
- c.add(buttonsPane,BorderLayout.SOUTH);
- this.setSize(320,500);
- this.setResizable(false);
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- this.setVisible(true);
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- new MainFrame("速算练习系统");
- }
-
- }
复制代码 ArithmeticView.java- package com.wang.view;
-
- import java.awt.Color;
- import java.awt.Dimension;
- import java.awt.GridLayout;
- import java.awt.event.ActionListener;
-
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JTextField;
- import javax.swing.SwingConstants;
-
- import com.wang.domain.Arithmetic;
-
- public class ArithmeticView extends JPanel {
- private JLabel[] labels;//JLabel数组
- private JTextField field;
-
- //题目的分区哟格式四个labels,以及一个用户输入的textfield
-
- public ArithmeticView(){
- setLayout(new GridLayout(1,5,1,1));//布局
- labels = new JLabel[4];
- //初始化每一个labels,可见,背景等等
- for(int i = 0; i < labels.length; i++){
- labels[i] = new JLabel();
- labels[i].setHorizontalAlignment(SwingConstants.CENTER);
- labels[i].setOpaque(true);
- labels[i].setBackground(Color.white);
- add(labels[i]);//添加到arithmetic面板
- }
- field = new JTextField();
- field.setEnabled(false);//不可编辑
- add(field);
- }
-
- //设置arithmeticView里面的值,变成字符串,内容在arithmetic获取
- public void setArithmetic(Arithmetic arithmetic){
- labels[0].setText(String.valueOf(arithmetic.getLeft()));
- labels[1].setText(Arithmetic.convert(arithmetic.getOp()));
- labels[2].setText(String.valueOf(arithmetic.getRight()));
- labels[3].setText("=");
- }
- public void setEnabled(boolean b){
- field.setEnabled(b);
- if(b){
- field.grabFocus();
- }
- }
- public JTextField getNumberField(){
- return this.field;
- }
-
- public void addActionListenerForField(ActionListener listener){
- field.addActionListener(listener);
- }
- @Override
- public Dimension getPreferredSize() {
- // TODO Auto-generated method stub
- return new Dimension(330,30);
- }
-
- @Override
- public Dimension getMaximumSize() {
- // TODO Auto-generated method stub
- return new Dimension(340,30);
- }
-
- @Override
- public Dimension getMinimumSize() {
- // TODO Auto-generated method stub
- return new Dimension(320,30);
- }
-
-
- }
复制代码 ButtonsPane.java- package com.wang.view;
-
- import java.awt.event.ActionListener;
-
- import javax.swing.JButton;
- import javax.swing.JPanel;
-
- public class ButtonsPane extends JPanel{//buttonspane继承JPanel这样可以添加JPanel面板
-
- private JButton[] buttons;//用JButton数组定义buttons数组
- private int size;
-
- public ButtonsPane(){
- this(2);
- }
- public ButtonsPane(int amt){//向面板增加了五个buttons
- size = amt;
- buttons = new JButton[size];
- for(int i = 0; i < size; i++){
- buttons[i] = new JButton();
- add(buttons[i]);
- }
- }
- public void setTitles(String[] titles){//把string数组里面的各个成员转变成button的标题的函数
- if(titles.length != size){
-
- }
- for(int i = 0; i < size; i++){
- buttons[i].setText(titles[i]);//定义每个按钮的标题
- }
- }
-
- //定义按钮是否可用,包含两个参数,一个序号加上true or false定义是否可用啊。
- public void setEnabled(int index,boolean b)throws RuntimeException{
- if(index < 0 || index >= size){
- throw new RuntimeException("下标越界");
- }
- buttons[index].setEnabled(b);
- }
-
-
- public JButton[] getButtons(){
- return buttons;
- }
-
- //为对应的按钮添加监听事件
- public void addActionListener(int index, ActionListener listener){
- buttons[index].addActionListener(listener);
- }
- }
复制代码 ClockView.java- package com.wang.view;
-
- import java.awt.Dimension;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
-
- import javax.swing.JPanel;
-
- import com.wang.domain.Clock;
-
- public class ClockView extends JPanel {
- private Clock clock;
-
- public void setClock(Clock clock){
- this.clock = clock;
- }
-
- @Override
- protected void paintComponent(Graphics g) {
- // TODO Auto-generated method stub
- super.paintComponent(g);
- if(clock != null){
- Graphics2D g2 = (Graphics2D)g;
- clock.drawClock(g2);
- }
- }
-
- public void move(){
- if(clock != null){
- clock.move();
- }
- }
- @Override
- public Dimension getPreferredSize() {
- // TODO Auto-generated method stub
- return new Dimension(30,30);
- }
-
-
- @Override
- public Dimension getMaximumSize() {
- // TODO Auto-generated method stub
- return new Dimension(30,30);
- }
-
- @Override
- public Dimension getMinimumSize() {
- // TODO Auto-generated method stub
- return new Dimension(30,30);
- }
-
- }
复制代码 MessagePane.java- package com.wang.view;
-
- import java.awt.BorderLayout;
-
- import javax.swing.JPanel;
-
- import com.wang.domain.Clock;
-
- public class MessagePane extends JPanel {
- private ClockView clockView;
- private TipPane tipPane;
-
- public MessagePane(){
- setLayout(new BorderLayout());
- tipPane = new TipPane("");
- clockView = new ClockView();
- Clock clock = new Clock(clockView);
- clockView.setClock(clock);
-
- add(clockView,BorderLayout.WEST);
- add(tipPane);
- }
- public void move(){
- clockView.move();
- }
- }
复制代码 NorthPane.java- package com.wang.view;
-
- import java.awt.GridLayout;
- import java.awt.event.ActionListener;
-
- import javax.swing.BorderFactory;
- import javax.swing.JPanel;
- import javax.swing.JTextField;
- import javax.swing.border.BevelBorder;
- import javax.swing.border.Border;
-
- import com.wang.domain.Arithmetic;
-
- public class NorthPane extends JPanel {//整个的北区,其中msgpane是包含的一个始终和一个提示语
- private ArithmeticView arithView;//ArithmeticView是用来展示题目的一个视图
- private MessagePane msgPane;
-
- public NorthPane(){
- setLayout(new GridLayout(2,1,1,1));
- Border border = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
- msgPane = new MessagePane();
- msgPane.setBorder(border);
-
- arithView = new ArithmeticView();
- border = BorderFactory.createBevelBorder(BevelBorder.RAISED);
- arithView.setBorder(border);
-
- add(msgPane);
- add(arithView);
- }
- public void setArithmetic(Arithmetic arithmetic){
- arithView.setArithmetic(arithmetic);
- }
- public void setEnabled(boolean b){
- arithView.setEnabled(b);
- }
-
-
- public JTextField getNumberField(){
- return arithView.getNumberField();
- }
-
- //位arithView面板添加监听事件,northPane可以监听arithView面板的事件
- public void addActionListenerForField(ActionListener listener){
- arithView.addActionListenerForField(listener);
- }
-
-
- public void move(){
- msgPane.move();
- }
- }
复制代码 TipPane.java- package com.wang.view;
-
- import java.awt.GridLayout;
-
- import javax.swing.JLabel;
- import javax.swing.JPanel;
-
- public class TipPane extends JPanel {
-
- private JLabel label;
-
- public TipPane(String tip){
- setLayout(new GridLayout(1,1));
- label = new JLabel(tip);
- add(label);
- }
- public void setTip(String tip){
- label.setText(tip);
- }
- }
复制代码 Arithmetic.java- package com.wang.domain;
-
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStream;
-
- public class Arithmetic {
- private int left;
- private int right;
- private byte op;
- private int answer;
- private String result;
-
- public Arithmetic(int left, int right, byte op){
- this.left = left;
- this.right = right;
- this.op = op;
- }
-
- public int getAnswer() {
- return answer;
- }
-
- public int setAnswer(int answer) {
- int r = 0;
- this.answer = answer;
- int temp = 0;
- switch(op){
- case 0:
- temp = left + right;
- break;
- case 1:
- temp = left - right;
- break;
- case 2:
- temp = left * right;
- break;
- case 3:
- temp = left / right;
- break;
- }
- if(temp == answer){
- result = "Õyè·";
- r = 1;
- }else{
- result = "′íÎó";
- r = 0;
- }
- return r;
- }
-
- public int getLeft() {
- return left;
- }
-
- public int getRight() {
- return right;
- }
-
- public byte getOp() {
- return op;
- }
-
- public String getResult() {
- return result;
- }
-
- public static String convert(byte op){
- String s = null;
- switch(op){
- case 0:
- s = "+";
- break;
- case 1:
- s = "-";
- break;
- case 2:
- s = "*";
- break;
- case 3:
- s = "/";
- break;
- }
- return s;
- }
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- return left + " "+ convert(op) + right + " = " + answer + result;
- }
- }
复制代码 ArithmeticFactory.java- package com.wang.domain;
-
- public class ArithmeticFactory {
-
- public static Arithmetic createArithmetic(){
- int left = (int)(Math.random() * 90 + 10);
- int right = (int)(Math.random() * 90 + 10);
- byte op = (byte)(Math.random() * 4);
- if(op == 1){
- if(left < right){
- int temp = left;
- left = right;
- right = temp;
- }
- }else if(op == 3){
- if(left < right){
- int temp = left;
- left = right;
- right = temp;
- }
- left = left - left % right;
- }
- return new Arithmetic(left,right,op);
- }
- }
复制代码 Clock.java- package com.wang.domain;
-
- import java.awt.Graphics2D;
- import java.awt.RenderingHints;
- import java.awt.geom.Ellipse2D;
- import java.awt.geom.Line2D;
-
- import javax.swing.JPanel;
-
- public class Clock {
- private final double x = 2;
- private final double y = 2;
- private final double length = 11;
- private final double diameter = 26;
- private double alpha = -Math.PI / 2;
-
- private JPanel view;
-
- public Clock(JPanel view){
- this.view = view;
- }
-
- public void drawClock(Graphics2D g){
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g.draw(new Ellipse2D.Double(x,y,diameter,diameter));
- g.draw(new Line2D.Double(
- x + diameter / 2,
- y + diameter / 2,
- x + diameter / 2 + length * Math.cos(alpha),
- y + diameter / 2 + length * Math.sin(alpha)));
- }
-
- public void move(){
- alpha += Math.PI / 30;
- view.repaint();
- }
- }
复制代码 ArithmeticController.java- package com.wang.ctrl;
-
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.util.ArrayList;
-
- import javax.swing.JFileChooser;
- import javax.swing.JTextArea;
- import javax.swing.JTextField;
- import javax.swing.Timer;
-
- import com.wang.domain.Arithmetic;
- import com.wang.domain.ArithmeticFactory;
- import com.wang.view.ButtonsPane;
- import com.wang.view.NorthPane;
-
- public class ArithmeticController implements ActionListener{
- private NorthPane northPane;
- private JTextArea textArea;
- private ButtonsPane buttonsPane;
-
- private Timer timer;
- private final int MAX = 120;
- private int counter = 0;
- private int correct = 0;//
-
- private Arithmetic arithmetic;
- private ArrayList<Arithmetic> arithmetics = new ArrayList<Arithmetic>();
- public ArithmeticController(final NorthPane northPane,
- final JTextArea textArea, final ButtonsPane buttonsPane){
- this.northPane = northPane;
- this.textArea = textArea;
- this.buttonsPane = buttonsPane;
- timer = new Timer(1000,this);
-
- northPane.addActionListenerForField(
- new ActionListener(){
-
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- System.out.println("northPane ActionListener");
-
- }
-
- });
-
- final JTextField field = northPane.getNumberField();
- field.addActionListener(
- new ActionListener(){
-
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- int answer = Integer.parseInt(field.getText());
- correct += arithmetic.setAnswer(answer);
- arithmetics.add(arithmetic);
-
- arithmetic = ArithmeticFactory.createArithmetic();
- northPane.setArithmetic(arithmetic);
- field.setText("");
- field.grabFocus();
- }
-
- });
-
- buttonsPane.addActionListener(0,
- new ActionListener(){
-
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- arithmetic = ArithmeticFactory.createArithmetic();
- northPane.setArithmetic(arithmetic);
- northPane.setEnabled(true);
- buttonsPane.setEnabled(0, false);
- timer.start();
- }
-
- });
-
-
-
- buttonsPane.addActionListener(1,
- new ActionListener(){
-
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- StringBuffer buffer = new StringBuffer();
- for(int index = 0; index < arithmetics.size(); index++){
- String s = arithmetics.get(index).toString() + "\n";
- buffer.append(s);
- }
- int score = (int)((double)correct / arithmetics.size() * 100);
- textArea.setText(buffer.toString() + score);
- }
-
- });
-
- buttonsPane.addActionListener(2, new ActionListener(){
-
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
-
- JFileChooser chooser = new JFileChooser();
- int result=chooser.showSaveDialog(null);
- if(result == JFileChooser.APPROVE_OPTION){
- File file=chooser.getSelectedFile();
- if(file != null && !file.getName().equals("") && file.isFile()){
- try {
- OutputStream os = new FileOutputStream(file,true);
- for(int index = 0; index < arithmetics.size(); index++){
- String s = arithmetics.get(index).toString() + "\n";
- os.write(s.getBytes());
- }
- } catch (FileNotFoundException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- }
- buttonsPane.setEnabled(2,false);
- }
-
- });
-
- buttonsPane.addActionListener(3,
- new ActionListener(){
-
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- System.exit(0);
- }
-
- });
- }
-
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- northPane.move();
- }
- }
复制代码
|
|