因今天图书管理模块写的数据库操作这里还是有问题,恰好今天也学习了一个名为小学生习题训练程序,是一个简单的图形化的关于监听事件的学习。
最后运行实例图如下
点击开始,会显示共几道题,输入答案后点击下一题或者按键盘Enter即可,最后显示结果。
我觉得这个小程序设计的核心所在就是如何随机的显示数学题,真相就是可以用JLable来设置。
package Java的小图形练习;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class StudentScreen extends JPanel{
JLabel num1=new JLabel("0 ");
JLabel num2=new JLabel("0 ");
JLabel op=new JLabel("+");
JLabel info=new JLabel("测试时间10分钟,点击“开始”按钮进行答题");
JTextField answer=new JTextField(10);
JButton next=new JButton("下一题");
JButton start=new JButton("开始");
JPanel p1=new JPanel();
JPanel p2=new JPanel();
JPanel p3=new JPanel();
public StudentScreen(){
setLayout(new GridLayout(3, 1));
p1.add(info);
p1.add(start);
p2.add(num1);
p2.add(op);
p2.add(num2);
p2.add(new JLabel("="));
p2.add(answer);
p3.add(next);
add(p1);
add(p2);
add(p3);
}
}
这个是显示的主界面,也是给我提示的地方。三个次jpanel,在主jpanel里面setLayout把布局设置好,当然好像这个方法是限于信息描述少的吧。
然后就再设置一个子类,来给上面这个父类改变显示即可
package Java的小图形练习;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.JOptionPane;
public class Exercises extends StudentScreen implements ActionListener,KeyListener{
int count=0;
int n1=0,n2=0;
int total=0;
int right=0;
long timenum=0;
Random rand=new Random();
public Exercises(int t){
this.total=t;
answer.setEnabled(false);
start.addActionListener(this);
next.addActionListener(this);
answer.addKeyListener(this);
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode()!=e.VK_ENTER)
return ;
compute();
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==start){
info.setText("共"+total+"题");
start.setEnabled(false); //按钮实效
answer.setEnabled(true);
answer.requestFocus();
count=right=0;
n1=rand.nextInt(100);
n2=rand.nextInt(100);
num1.setText(""+n1);
num2.setText(""+n2);
timenum=System.currentTimeMillis();
}
else if (e.getSource()==next){
compute();
}
}
private void compute() {
float x=0;
if (op.getText().equals("+"))
x=n1+n2;
else if (op.getText().equals("-"))
x=n1-n2;
else if (op.getText().equals("*"))
x=n1*n2;
else if (op.getText().equals("/"))
x=n1/n2;
if (x==Float.parseFloat(answer.getText()))
right++;
count++;
if (count==total){
JOptionPane.showMessageDialog(null, "总题数:"+total+";答对:"+right+"道;费时:"+(System.currentTimeMillis()-timenum)/60000+"分");
}
n1=rand.nextInt(100)+1;
n2=rand.nextInt(100)+1;
num1.setText(""+n1);
num2.setText(""+n2);
op.setText(setOperator());
answer.setText("");
answer.requestFocus();
}
private String setOperator() {
String o=null;
if (n1>50&&n2>50){
if (n1>n2)
o="+";
else
o="-";
}
else if (n1>50&&n2<=50){
if (n2>10)
o="-";
else
o="/";
}
else if (n2>50&&n1<=50){
if (n1>10)
o="+";
else
o="*";
}
else if (n1<=50&&n2<=50){
if (n1>n2&&n2<10)
o="/";
else if (n1<10&&n2<10)
o="*";
else
o="+";
}
return o;
}
}
其实如果仅仅是按逻辑思维来想的话是很简单,但是来写确实得想好需要构造几个函数,每个函数需要什么功能。
主要是compute()来更新主界面,看,是不是把结果也是在这个函数的。
package Java的小图形练习;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class StudentTest {
public static void main(String[] args) {
JFrame test=new JFrame();
JPanel t=new Exercises(10);
test.add(t);
test.setVisible(true);
test.pack();
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
最后也发现哦,jf是可以直接添加jp的,他喵的哦,前几天居然还用其它方法了。