⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testpanel.java

📁 一个简单的C/S模式考试系统
💻 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 + -