很简单的在线考试系统
学习java swing,写下的考试系统,主要功能就是在线答题,随机出题目。在线测试,保存题目。MainFrame.javapackage 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.javapackage 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;
//初始化每一个labels,可见,背景等等
for(int i = 0; i < labels.length; i++){
labels = new JLabel();
labels.setHorizontalAlignment(SwingConstants.CENTER);
labels.setOpaque(true);
labels.setBackground(Color.white);
add(labels);//添加到arithmetic面板
}
field = new JTextField();
field.setEnabled(false);//不可编辑
add(field);
}
//设置arithmeticView里面的值,变成字符串,内容在arithmetic获取
public void setArithmetic(Arithmetic arithmetic){
labels.setText(String.valueOf(arithmetic.getLeft()));
labels.setText(Arithmetic.convert(arithmetic.getOp()));
labels.setText(String.valueOf(arithmetic.getRight()));
labels.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.javapackage 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;
for(int i = 0; i < size; i++){
buttons = new JButton();
add(buttons);
}
}
public void setTitles(String[] titles){//把string数组里面的各个成员转变成button的标题的函数
if(titles.length != size){
}
for(int i = 0; i < size; i++){
buttons.setText(titles);//定义每个按钮的标题
}
}
//定义按钮是否可用,包含两个参数,一个序号加上trueor false定义是否可用啊。
public void setEnabled(int index,boolean b)throws RuntimeException{
if(index < 0 || index >= size){
throw new RuntimeException("下标越界");
}
buttons.setEnabled(b);
}
public JButton[] getButtons(){
return buttons;
}
//为对应的按钮添加监听事件
public void addActionListener(int index, ActionListener listener){
buttons.addActionListener(listener);
}
}ClockView.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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();
}
} 楼主牛人啊
页:
[1]