📄 testpanel.java
字号:
import java.util.Hashtable;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
public class TestPanel extends JPanel implements ActionListener,Runnable {
//声明套接字通信用到的类对象和变量、计时器、线程对象
private Socket connectToServer;//套接字对象
private DataInputStream inFromServer;
private DataOutputStream outToServer;
private Thread thread;//线程对象
String id;
JPanel radioPanel;
JPanel radioPanel1;
JPanel radioPanel2;
Hashtable http;
Checkbox A,B,C,D;
String type="";
int flag1=0;int i;
String content;
private Timer TestTimer; //计时器
private int testTime; //考试剩余时间
static int k;
static int l=0;
static int flag=0;
String b[]=new String[1];
String a[]=new String[1000];
//图形界面组件:北、中、南的布局
//北
private JButton startButton; //建立套接字通信按钮
private JLabel timeLabel; //显示考试剩余时间
private JLabel yixuan;//显示已选答案
private JLabel type1;//显示试题类型
//中
private JTextArea questionArea; //显示题目内容的文本区
//南
private Checkbox radioButton[]=new Checkbox[4]; //四个单选按钮
private Checkbox radioButton1[]=new Checkbox[2];
private CheckboxGroup buttonGroup=new CheckboxGroup();
private JButton answerButton; //提交答案按狃
private JButton scoreButton; //显示成绩按钮
private JButton questionButton;//取得考试题目按钮
private JButton backButton;
/** 构造方法:初始化面板中的图形组件、数据流、计时器、线程*/
public TestPanel(InetAddress add,int port,String id) {
this.id=id;//记录id
http=new Hashtable();
//初始化面板中的图形组件
initPanelGUI();
//初始化套接字和接收、发送数据的数据流
try {
connectToServer=new Socket(add,port);
inFromServer=new DataInputStream(connectToServer.getInputStream());
outToServer=new DataOutputStream(connectToServer.getOutputStream());
System.out.println(connectToServer.getInetAddress());
}
catch(IOException e) {
System.out.println("TestPanel连接错误");
startButton.setEnabled(false); //设置"开始考试"按钮不能点击
}
//初始化计时器,每隔1000豪秒引发ActionEvent事件
TestTimer=new Timer(1000,this);
//创建并启动线程对象
thread= new Thread(this);
thread.start();
}
//**按钮事件动作响应
public void actionPerformed(ActionEvent e) {
if(e.getSource()==startButton) {
startButtonPerformed();//
}
if(e.getSource()==TestTimer) {
TestTimerPerformed();//
}
if(e.getSource()==questionButton) {
questionButtonPerformed();//
}
if(e.getSource()==answerButton) {
answerButtonPerformed();//
}
if(e.getSource()==scoreButton) {
scoreButtonPerformed();//
}
if(e.getSource()==backButton){
backButtonPerformed();
}
}
/*线程启动后执行run()方法,接收服务器发送回来的信息*/
public void run() {
String inStr="";
String in1="";
boolean si=true;
try
{ while(si) {
inStr=inFromServer.readUTF();//从服务器套接字读取数据
if(inStr.startsWith("考试时间")) {
inStr=inStr.substring(inStr.indexOf("@")+1);
in1=inStr.substring(inStr.indexOf("@")+1);
k=Integer.parseInt(in1);//题目个数
inStr=inStr.substring(0,inStr.indexOf("@"));//提取考试时间
testTime=Integer.parseInt(inStr); //得到考试时间
timeLabel.setText(convertTime(testTime)); //
TestTimer.start();//启动计时器,每隔1秒引发动作事件
//System.out.print(k);
}
if(inStr.startsWith("下一题")) {
content=inStr.substring(inStr.indexOf("@")+1);//提取试题内容,考试类
inStr=inStr.substring(inStr.indexOf("@")+1);
type=inStr.substring(0,inStr.indexOf("@"));
System.out.print("第一ti"+type);
inStr=inStr.substring(inStr.indexOf("@")+1);
System.out.print("第一ti"+inStr);
String inStr1=inStr.substring(0,inStr.indexOf("@")-1);
System.out.print("第一ti"+inStr1);
questionArea.setText(inStr1);
if(type.equals("a")){
radioPanel.setVisible(true);
radioPanel1.setVisible(false);
radioPanel2.setVisible(false);
type1.setText("单项选择题");
}
if(type.equals("b")){
radioPanel2.setVisible(true);
radioPanel1.setVisible(false);
radioPanel.setVisible(false);
type1.setText("多项选择题");
}
if(type.equals("c")){
radioPanel1.setVisible(true);
radioPanel2.setVisible(false);
radioPanel.setVisible(false);
type1.setText("判断题");
}
answerButton.setEnabled(true);
//显示在文本区
}
if(inStr.startsWith("成绩")) {
JOptionPane.showMessageDialog(null,inStr,"成绩显示",JOptionPane.INFORMATION_MESSAGE);
socketClosing();
break;
}
if(inStr.startsWith("停止")){
socketClosing();
questionArea.setText("服务器连接终止");
break;
}
}}
catch (Exception e)
{ socketClosing();
questionArea.setText("服务器连接终止");
}
}
/**初始化面板中的图形组件*/
private void initPanelGUI() {
setLayout(new BorderLayout());
//北—添加"开始考试"按钮和剩余时间标签
JPanel northPanel=new JPanel();
northPanel.setLayout(new GridLayout(4,1));
startButton=new JButton("开始考试");
startButton.addActionListener(this);
timeLabel=new JLabel("考试剩余时间");
yixuan=new JLabel("");
type1=new JLabel("");
northPanel.add(startButton);
northPanel.add(timeLabel);
northPanel.add(yixuan);
northPanel.add(type1);
add(northPanel,BorderLayout.NORTH);
//中—添加试题显示区
questionArea=new JTextArea(30,10);
questionArea.setLineWrap(true);
questionArea.setWrapStyleWord(true);
questionArea.setFont(new Font("幼圆",Font.PLAIN,16));
int vScroll=ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int hScroll=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER;
add(new JScrollPane(questionArea,vScroll,hScroll),BorderLayout.CENTER);
//南—4个单选按钮
JPanel southPanel=new JPanel();
radioPanel=new JPanel(); //放4个单选按钮的面板
String s[]={"A","B","C","D"};
for(int i=0;i<radioButton.length;i++) {
radioButton[i]=new Checkbox(s[i],buttonGroup,false);
radioPanel.add(radioButton[i]);
}
radioPanel1=new JPanel();
String t[]={"T","F"};
for(int i=0;i<radioButton1.length;i++) {
radioButton1[i]=new Checkbox(t[i],buttonGroup,false);
radioPanel1.add(radioButton1[i]);
}
radioPanel2=new JPanel();
A=new Checkbox("A");
B=new Checkbox("B");
C=new Checkbox("C");
D=new Checkbox("D");
radioPanel2.add(A);
radioPanel2.add(B);
radioPanel2.add(C);
radioPanel2.add(D);
//初始化各按钮,增加鉴听,设置为不可点击
answerButton=new JButton("提交答案");
answerButton.setEnabled(false);
answerButton.addActionListener(this);
backButton=new JButton("上一题");
backButton.setEnabled(false);
backButton.addActionListener(this);
questionButton=new JButton("下一题");
questionButton.setEnabled(false);
questionButton.addActionListener(this);
scoreButton=new JButton("成绩");
scoreButton.setEnabled(false);
scoreButton.addActionListener(this);
southPanel.add(radioPanel,-1);
southPanel.add(radioPanel1,-1);
southPanel.add(radioPanel2,-1);
southPanel.add(backButton);
southPanel.add(answerButton);
southPanel.add(questionButton);
southPanel.add(scoreButton);
add(southPanel,BorderLayout.SOUTH);radioPanel2.setVisible(false);
radioPanel1.setVisible(false);
radioPanel.setVisible(true);
}
/**把毫秒表示的时间转化为时、分、秒的字符串表示*/
private String convertTime(int time) {
int leftTime=time/1000;
int leftHour=leftTime/3600;
int leftSecond=leftTime%60;
int leftMinute=(leftTime-leftHour*3600)/60;
String timeStr="剩余时间:"+leftHour+"小时"+leftMinute+"分"+leftSecond+"秒";
return timeStr;
}
/**点击"开始考试"按钮后要执行的任务*/
private void startButtonPerformed(){
startButton.setEnabled(false); //"开始考试"按钮设置为无效
questionButton.setEnabled(false); //设置"下一题"按钮可点击
answerButton.setEnabled(true);
radioPanel.setVisible(true);
flag1=0;
try
{ // 给服务器发送字符串"开始考试",服务器收到后返回考试用时
flag=flag+1;
outToServer.writeUTF("开始考试@"+id);
}
catch (IOException e)
{System.out.println("向服务器写 开始考试 失败");
}
}
/**计时器倒计时*/
private void TestTimerPerformed() {
testTime-=1000; //倒计时:时间减少1秒
timeLabel.setText(convertTime(testTime)); //在标签上显示时间
if(testTime<=0) { //倒计时为0
TestTimer.stop();//计时器停止
scoreButtonPerformed();
questionButton.setEnabled(false);//"下一题"按钮不能用
answerButton.setEnabled(false); //提交答案 不能用
}
}
//点击"上一题"按钮后要执行的任务
private void backButtonPerformed() {
for(int i=0;i<radioButton.length;i++)
radioButton[i].setState(false);
for(int i=0;i<radioButton1.length;i++)
radioButton1[i].setState(false);
A.setState(false);B.setState(false);C.setState(false);D.setState(false);
answerButton.setEnabled(true); //设置"提交答案"按钮可点击
backButton.setEnabled(true);
flag--;scoreButton.setEnabled(true);
if(flag>0)
{questionButton.setEnabled(true); }
else
flag=1;
Create cr=new Create(content);
http=cr.getHash();
String content1=(http.get(flag).toString()).substring((http.get(flag).toString()).indexOf("@")+1);
questionArea.setText(content1);
type=(http.get(flag).toString()).substring(0,(http.get(flag).toString()).indexOf("@"));
if(type.equals("a")){
radioPanel.setVisible(true);
radioPanel1.setVisible(false);
radioPanel2.setVisible(false);
type1.setText("单项选择题");
}
if(type.equals("b")){
radioPanel2.setVisible(true);
radioPanel1.setVisible(false);
radioPanel.setVisible(false);
type1.setText("多项选择题");
}
if(type.equals("c")){
radioPanel1.setVisible(true);
radioPanel2.setVisible(false);
radioPanel.setVisible(false);
type1.setText("判断题");
}
String answer=" 已选答案为:"+a[flag];yixuan.setText(answer);
}
/**点击"下一题"按钮后要执行的任务*/
private void questionButtonPerformed() {
questionButton.setEnabled(true); //"下一题"按钮设置为无效
answerButton.setEnabled(true); //设置"提交答案"按钮可点击
flag++;
if(flag>k)
{flag=k;answerButton.setEnabled(false);}
else{scoreButton.setEnabled(true);
}
Create cr=new Create(content);
http=cr.getHash();
String content1=(http.get(flag).toString()).substring((http.get(flag).toString()).indexOf("@")+1);
questionArea.setText(content1);
type=(http.get(flag).toString()).substring(0,(http.get(flag).toString()).indexOf("@"));
if(type.equals("a")){
radioPanel.setVisible(true);
radioPanel1.setVisible(false);
radioPanel2.setVisible(false);
type1.setText("单项选择题");
}
if(type.equals("b")){
radioPanel2.setVisible(true);
radioPanel1.setVisible(false);
radioPanel.setVisible(false);
type1.setText("多项选择题");
}
if(type.equals("c")){
radioPanel1.setVisible(true);
radioPanel2.setVisible(false);
radioPanel.setVisible(false);
type1.setText("判断题");
}
String answer=" 已选答案为:"+a[flag];yixuan.setText(answer);
}
/**点击"提交答案"按钮要执行的任务*/
private void answerButtonPerformed() {
String answer="空";
backButton.setEnabled(true);//上一题能用
questionButton.setEnabled(true);//"下一题"按钮能用
answerButton.setEnabled(true); //提交答案 不能用
if(type.equals("a")){
for(int i=0;i<radioButton.length;i++) {
if(radioButton[i].getState()) {
answer="已选答案:"+radioButton[i].getLabel();
b[0]=radioButton[i].getLabel(); //得到选择答案
if(b[0]==null)b[0]="n";
a[flag]=b[0];radioButton[i].setState(false);
System.out.println("单选:"+a[l]);
System.out.println(l);
break;
}
}
}
if(type.equals("b")){//多选
b[0]="";
if(A.getState())
{b[0]="A";A.setState(false);}
if(B.getState())
{b[0]=b[0]+"B";B.setState(false);}
if(C.getState())
{b[0]=b[0]+"C";C.setState(false);}
if(D.getState())
{b[0]=b[0]+"D";D.setState(false);}
if(b[0]==null)b[0]="n";
a[flag]=b[0];
System.out.println("单选:"+a[flag]);
System.out.println(flag);
}
if(type.equals("c")){//单选
for(int i=0;i<radioButton1.length;i++) {
if(radioButton1[i].getState()) {
answer="已选答案:"+radioButton1[i].getLabel();
b[0]=radioButton1[i].getLabel(); //得到选择答案
if(b[0]==null)b[0]="n";
a[flag]=b[0];
System.out.println("单选:"+a[flag]);
System.out.println(flag);
break;
}
}
}
yixuan.setText(b[0]);
}
/**点击 成绩 按钮后要执行的任务*/
private void scoreButtonPerformed() {
try
{ questionButton.setEnabled(false);
answerButton.setEnabled(false); //提交答案按狃
backButton.setEnabled(false);
scoreButton.setEnabled(false);
String menss="@"+a[1];
System.out.println(a[0]);
for(int l1=2;l1<k+1;l1++)
{String dsf=String.valueOf(l1);
menss=menss.trim()+"@"+a[l1];
}
System.out.print("您好!您的所选答案为:"+menss.trim());
outToServer.writeUTF("成绩@"+menss.trim()+"@"+id);
}
catch (IOException e)
{
System.out.println("要求服务器发送 成绩 失败");
}
}
/**关闭所有连接*/
private void socketClosing() {
try
{
//outToServer.writeUTF("交卷@"+id);
inFromServer.close();
outToServer.close();
connectToServer.close();
}
catch (Exception e)
{
System.out.println("关闭socket异常");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -