今天看了看io流部分的内容,仿照书上写了个小例子,读取一个文件,并在Frame中显示以及进行一系列操作。以下是代码:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class SingleSelect {
public static void main(String[] args)
{
MyWindow my=new MyWindow("英语四级单选");
my.validate();
}
}
class MyWindow extends Frame implements ActionListener,ItemListener
{
Label l1=new Label("题目");
Label l2=new Label("选择答案");
Label l3=new Label("您的得分"); 效果图:
Button b1=new Button("开始练习");
Button b2=new Button("下一题");
TextField t1=new TextField(80);
TextField t2=new TextField(50);
Checkbox check[];
FileReader file;
BufferedReader bufr;
String str[]=new String[7],s;//str[]数组用来存储题目以及选项和正确答案,s用来存储读取的一行字符
CheckboxGroup age=new CheckboxGroup();//建立一个Checkbox组,CheckboxGroup 中的复选框按钮可以在任意给定的时间处于 "on" 状态。按下任何按钮,可将按钮状态设置为 "on",并且强制将任何其他 "on" 状态的按钮更改为 "off" 状态。
static int score=0;
MyWindow(String s)
{
check=new Checkbox[5];
for(int i=0;i<=4;i++)
{
check[i]=new Checkbox("",false,age);//在CheckboxGroup中每个Checkbox的状态为false
check[i].addItemListener(this);
}
b1.addActionListener(this);
b2.addActionListener(this);
setBounds(100,100,700,300);
setVisible(true);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
try{
file=new FileReader("f:English.txt");
bufr=new BufferedReader(file);
}
catch(IOException e){}
Box box=Box.createVerticalBox();
Panel p1=new Panel(),p2=new Panel(),p3=new Panel(),p4=new Panel();
p1.add(l1);p1.add(t1);
p2.add(l2);
for(int i=0;i<=4;i++)
{
p2.add(check[i]);
}
p3.add(l3);p3.add(t2);
p4.add(b1);p4.add(b2);
box.add(p1);box.add(p2);box.add(p3);box.add(p4);
add(box,BorderLayout.CENTER);
}
public void reading()
{
int i=0;
try{
s=bufr.readLine();
if(!(s.startsWith("end")))
{
StringTokenizer tokenizer=new StringTokenizer(s,"#");//以#为分隔符,读取字符
while(tokenizer.hasMoreTokens())//如果s中分隔符后边还有字符则返回true
{
str[i]=tokenizer.nextToken();//将每个分隔符后边的字符赋给str[i]
i++;
}
t1.setText(str[0]);
for(int j=1;j<=4;j++)
{
check[j-1].setLabel(str[j]);
}
check[4].setLabel("空选项");
}
else
{
t1.setText("学习完毕");
for(int j=0;j<=3;j++)
{
check[j].setLabel("end");
bufr.close();
file.close();
}
}
}
catch(Exception exp){t1.setText("无试题文件");}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==b1)
{
score=0;
t2.setText(String.valueOf(score));
reading();
try
{
file=new FileReader("f:Enlish.txt");
bufr=new BufferedReader(file);
}
catch(IOException exp){}
reading();
}
if(e.getSource()==b2)
{
reading();
for(int j=0;j<5;j++)
{
check[j].setEnabled(true);
}
}
}
public void itemStateChanged(ItemEvent e)
{
for(int j=0;j<5;j++)
{
if(check[j].getLabel().equals(str[5])&&check[j].getState())
{
score++;
t2.setText(String.valueOf(score));
}
}
for(int j=0;j<5;j++)
{
check[j].setState(false);
}
}
}
其实,这个程序中有几个问题未解决,第一题即使对了也不记分,而且在计数上也存在问题,答对的个数总和显示的不一致。可能是对setState()和setEnabled()的功能不熟悉。好吧,有再优化改进一下!