📄 servermain.java
字号:
import javax.swing.*;
import javax.swing.Timer;
import javax.swing.table.*;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import java.util.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.util.regex.*;
public class ServerMain extends JFrame implements Runnable,ActionListener
{
/**
* @param args
*/
private ServerInfo serverInfo;
private int currentQues=1;
private String [] playerInfo;
private ArrayList players = new ArrayList();
private String currentNum;
private boolean canAnswer = true;
private JTable table = null;
private MyTable1 defaultModel = null;
private JLabel JLQuestion ;
private JButton JBUp ;
private JButton JBDown;
private Socket currentSocket;
private ArrayList orderNumList = new ArrayList();
public ServerMain(ServerInfo serverInfo)
{
this.serverInfo = serverInfo;
init();
}
private void init()
{
this.setTitle(serverInfo.getTitle());
this.setBounds(0, 0, 900, 700);
JPanel jpUp = new JPanel();
jpUp.setBackground(new Color(85,141,142));
JPanel jpMid = new JPanel();
JPanel jpDown = new JPanel();
this.setLayout(new BorderLayout());
this.add(jpUp,BorderLayout.NORTH);
this.add(jpMid,BorderLayout.CENTER);
this.add(jpDown,BorderLayout.SOUTH);
JPanel jpDown1 = new JPanel();
JPanel jpDown2 = new JPanel();
jpDown1.setBackground(new Color(85,141,142));
jpDown2.setBackground(new Color(85,141,142));
jpDown.setLayout(new GridLayout(2,1));
jpDown.add(jpDown1);
jpDown.add(jpDown2);
JLabel JLTitle = new JLabel(serverInfo.getTitle());
JLTitle.setFont(new Font("宋体",Font.BOLD,80));
jpUp.add(JLTitle);
String[] n = {""};;
String [][] p = new String[serverInfo.getQuestionNumber()+3][1];
p[0][0] = "学号";
p[1][0] = "姓名";
p[2][0] = "积分";
for(int i=3; i<(serverInfo.getQuestionNumber()+3); i++)
{
p[i][0] = (String)( "第"+(i-2)+"题");
}
defaultModel = new MyTable1(p,n);
//用Object[] 一样可以实现,就不用Vector了
//Vector newVector = defaultModel.convert(newcolumn);
table=new JTable(defaultModel);
//让第一题所在行处于选中状态
table.setRowSelectionInterval(currentQues+2, currentQues+2);
//table.;
//table.setFocusable(true);//
table.setFont(new Font("宋体",Font.BOLD,50));
table.setForeground(Color.RED);
table.setRowHeight(60);
table.setRowHeight(0, 100);
table.setRowHeight(1, 100);
table.setRowHeight(2, 100);
//table.revalidate();
//table.setPreferredScrollableViewportSize(new Dimension(400, 80));
JScrollPane s = new JScrollPane(table);
this.add(s,BorderLayout.CENTER);
JLabel JLRule = new JLabel("竞赛规则:原始积分"+serverInfo.getInitScore()
+"分,答对一题加"+serverInfo.getRightAddScore()
+"分,答错一题扣"+serverInfo.getWrongSubScore()
+"分,犯规罚扣"+serverInfo.getFaultSubScore()+"分。");
jpDown1.setLayout(null);
JLRule.setBounds(10, 10, 700, 20);
JLRule.setFont(new Font("宋体",Font.BOLD,15));
jpDown1.add(JLRule);
JLQuestion = new JLabel("目前正在进行的是第1题");
JBUp = new JButton("上一题");
JBDown = new JButton("下一题");
JBUp.setBackground(new Color(123,175,176));
JBDown.setBackground(new Color(123,175,176));
JBUp.setForeground(Color.RED);
JBDown.setForeground(Color.RED);
JLQuestion.setFont(new Font("宋体",Font.BOLD,20));
JBUp.setFont(new Font("宋体",Font.BOLD,15));
JBDown.setFont(new Font("宋体",Font.BOLD,15));
jpDown2.add(JLQuestion);
jpDown2.add(JBUp);
jpDown2.add(JBDown);
JBUp.addActionListener(this);
JBDown.addActionListener(this);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public ServerInfo getServerInfo()
{
return this.serverInfo;
}
public void setSocket(Socket currentSocket)
{
this.currentSocket = currentSocket;
}
public void setCanAnswer(boolean b)
{
canAnswer = b;
}
public void addQuesNum()
{
currentQues++;
JLQuestion.setText("目前正在进行的是第"+(currentQues)+"题");
table.setRowSelectionInterval(currentQues+2, currentQues+2);
}
public void update(int answerType, int quesType)
{
for(int i=1; i<defaultModel.getColumnCount();i++)
{
if(defaultModel.getValueAt(0, i).equals(currentNum))
{
updateScore(answerType,quesType,2,i);
updateFlag(answerType,currentQues+2,i);
}
}
}
private void updateScore(int type, int quesType,int rowIndex,int colIndex)
{
String calScore = (String)defaultModel.getValueAt(rowIndex, colIndex);
String result;
switch(type)
{
case 1:
result = new Integer(Integer.parseInt(calScore) +serverInfo.getRightAddScore()*quesType).toString();
defaultModel.setValueAt(result,rowIndex,colIndex);
break;
case 2:
result = new Integer(Integer.parseInt(calScore) -serverInfo.getWrongSubScore()*quesType).toString();
defaultModel.setValueAt(result,rowIndex,colIndex);
break;
case 3:
result = new Integer(Integer.parseInt(calScore) -serverInfo.getFaultSubScore()*quesType).toString();
defaultModel.setValueAt(result,rowIndex,colIndex);
break;
default:
System.out.println("答题结果类型错误!");
}
}
private void updateFlag(int type,int rowIndex,int colIndex)
{
String flag = (String)defaultModel.getValueAt(rowIndex, colIndex);
if(flag == null)
{
flag = "";
}
String result;
switch(type)
{
case 1:
result = flag+"√";
defaultModel.setValueAt(result,rowIndex,colIndex);
break;
case 2:
result = flag+"×";
defaultModel.setValueAt(result,rowIndex,colIndex);
break;
case 3:
result = flag+"※";
defaultModel.setValueAt(result,rowIndex,colIndex);
break;
default:
System.out.println("答题结果类型错误!");
}
}
public void actionPerformed(ActionEvent e)
{
//static int i=0;
Object command = e.getSource();
if(command == JBUp)
{
if(currentQues > 1)
{
JLQuestion.setText("目前正在进行的是第"+(--currentQues)+"题");
table.setRowSelectionInterval(currentQues+2, currentQues+2);
}
}
if(command == JBDown)
{
JLQuestion.setText("目前正在进行的是第"+(++currentQues)+"题");
table.setRowSelectionInterval(currentQues+2, currentQues+2);
}
}
private boolean isOrderNumExist(String orderNum)
{
for(int i=0; i < orderNumList.size(); i++)
{
if(orderNum.equals((String)orderNumList.get(i)))
{
return true;
}
}
return false;
}
public void run()
{
// TODO Auto-generated method stub
byte [] buf = new byte[1024];
int len = 0;
String reserveData;
InputStream threadIs = null;
OutputStream threadOs = null;
try
{
threadIs = currentSocket.getInputStream();
len = threadIs.read(buf);
reserveData= new String(buf,0,len);
System.out.println(reserveData);
Pattern pattern = Pattern.compile(":");
playerInfo = pattern.split(reserveData);
players.add(playerInfo);
String [] newcolumn = new String[serverInfo.getQuestionNumber()+3];
threadOs = currentSocket.getOutputStream();
if(isOrderNumExist(playerInfo[0]))
{
threadOs.write("0".getBytes());
System.out.println("failure");
}
else
{
threadOs.write("success".getBytes());
orderNumList.add(playerInfo[0]);
newcolumn[0] = playerInfo[0];
newcolumn[1] = playerInfo[1];
newcolumn[2] = new Integer(serverInfo.getInitScore()).toString();
defaultModel.addColumn("",newcolumn);
table.setRowHeight(0, 100);
table.setRowHeight(1, 100);
table.setRowHeight(2, 100);
while(true)
{
len = threadIs.read(buf);
if(canAnswer)
{
canAnswer = false;
currentNum= new String(buf,0,len);
String [] player = null;
for(int i=0;i < players.size();i++)
{
System.out.println("第"+i+"位选手");
System.out.println(currentNum+"选手");
player = (String [])players.get(i);
if(player[0].equals(currentNum))
{
break;
}
}
if(player != null)
{
System.out.println(player[0]);
System.out.println(player[1]);
new AnswerRight(player[0],player[1],this);
}
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
/*
public String answerFirst()
{
Iterator itr = inputStreamList.iterator();
}
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
/*ServerInfo serverInfo = new ServerInfo();
serverInfo.setTitle("sdfsdf");
serverInfo.setRightAddScore("90");
serverInfo.setWrongSubScore("90");
serverInfo.setFaultSubScore("90");
serverInfo.setInitScore("90");
serverInfo.setPlayerNumber("90");
serverInfo.setAnswerTime("90");
ServerMain serverMain = new ServerMain(serverInfo);
try
{
ServerSocket ss = new ServerSocket(9999);
while(true)
{
Socket s = ss.accept();
InputStream is = s.getInputStream();
serverMain.setInputStream(is);
new Thread(serverMain).start();
}
}
catch(Exception e)
{
System.out.println("服务器套接字创建失败");
e.printStackTrace();
}
*/
}
}
class MyTable1 extends DefaultTableModel
{
public MyTable1()
{
super();
}
public MyTable1(Object[][] data, Object[] columnNames)
{
super(data,columnNames) ;
}
public boolean isCellEditable(int rowIndex,int columnIndex)
{
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -