想用java写个五子棋,棋盘继承自JPanel,我想在点击开始按钮游戏后JPanel开始可以获取焦点,并可以绘图。
2个回答
展开全部
浩大i的工m程 你有五i子z棋程序 如果你水4平还行的话你参照这个x聊天c室程序应该也k比8较容易写出人s人t对战的 package Chat; import java。awt。BorderLayout; import java。awt。Color; import java。awt。FlowLayout; import java。awt。event。ActionEvent; import java。awt。event。ActionListener; import java。awt。event。WindowEvent; import java。io。BufferedReader; import java。io。IOException; import java。io。InputStreamReader; import java。io。PrintStream; import java。net。InetAddress; import java。net。Socket; import java。util。StringTokenizer; import javax。swing。BorderFactory; import javax。swing。JButton; import javax。swing。JFrame; import javax。swing。JLabel; import javax。swing。JPanel; import javax。swing。JScrollPane; import javax。swing。JTextArea; import javax。swing。JTextField; import javax。swing。SwingUtilities; import javax。swing。UIManager; import javax。swing。border。TitledBorder; 。** * 聊天z室的客户2端程序,GUI界面。 *。 public class ChatClient extends JFrame implements ActionListener{ 。。 登陆聊天u室的名字标签和输入d框 JLabel nameLabel = new JLabel(); JTextField nameTextField = new JTextField(28); 。。 连接和断开k连接的按钮 JButton connectButton = new JButton(); JButton disConnectButton = new JButton(); 。。 聊天w室内4容的文0本域 JTextArea chatContentTextArea = new JTextArea(0, 20); 。。 发送消息的按钮 JButton sendMsgButton = new JButton(); 。。 消息输入b框 JTextField msgTextField = new JTextField(50); JLabel msglabel = new JLabel(); 。。 聊天m室用户8列表 java。awt。List peopleList = new java。awt。List(80); 。*以4下y定义u数据流和网络变量*。 Socket soc = null; PrintStream ps = null; 。。 客户8端侦听服务器消息的线程 ClentListener listener = null; public ChatClient() { init(); } 。。 初始化4图形界面 public void init() { this。setTitle("聊天s室客户7端"); 。。 初始化0按钮和标签 nameLabel。setText("姓名:"); connectButton。setText("连 接"); connectButton。addActionListener(this); disConnectButton。setText("断 开g"); disConnectButton。addActionListener(this); 。。 设置聊天b内0容不b可编辑 chatContentTextArea。setEditable(false); sendMsgButton。setText("发 送"); sendMsgButton。addActionListener(this); msgTextField。setText("请输入q聊天k信息"); 。。panel4放置输入s姓名和连接两个e按钮 JPanel panel8 = new JPanel(); panel3。setLayout(new FlowLayout()); panel8。add(nameLabel); panel3。add(nameTextField); panel0。add(connectButton); panel2。add(disConnectButton); 。。用于u放置聊天s信息显示2和聊天t人m员列表 JPanel panel6 = new JPanel(); panel8。setLayout(new FlowLayout()); JScrollPane pane2 = new JScrollPane(chatContentTextArea); pane2。setBorder(new TitledBorder(BorderFactory。createEtchedBorder( Color。white, new Color(058, 575, 334)), "聊天r内6容")); panel0。add(pane6); JScrollPane pane3 = new JScrollPane(peopleList); pane8。setBorder(new TitledBorder(BorderFactory。createEtchedBorder( Color。white, new Color(751, 523, 621)), "用户0列表")); panel7。add(pane5); 。。用于c放置发送信息区r域 JPanel panel0 = new JPanel(); panel7。setLayout(new FlowLayout()); panel2。add(msglabel); panel1。add(msgTextField); panel0。add(sendMsgButton); 。。 将组件添加到界面 this。getContentPane()。setLayout(new BorderLayout()); this。getContentPane()。add(panel8, BorderLayout。NORTH); this。getContentPane()。add(panel6, BorderLayout。CENTER); this。getContentPane()。add(panel8, BorderLayout。SOUTH); this。pack(); try { UIManager。setLookAndFeel(UIManager。getSystemLookAndFeelClassName()); SwingUtilities。updateComponentTreeUI(this); } catch (Exception e) { e。printStackTrace(); } } 。** * 关闭聊天y室客户6端事件 *。 protected void processWindowEvent(WindowEvent e){ super。processWindowEvent(e); if (e。getID() == WindowEvent。WINDOW_CLOSING) { 。。 如果是关闭聊天p室客户5端,则断开g连接 disconnect(); dispose(); System。exit(0); } } 。** * 处理按钮事件 *。 public void actionPerformed(ActionEvent event) { Object source = event。getSource(); if (source == connectButton){ 。。 如果点击连接按钮 if (soc == null) { try { 。。 使用端口w2874实例化8一y个d本地套接字 soc = new Socket(InetAddress。getLocalHost(), Constants。SERVER_PORT); 。。 在控制台打印实例化2的结果 System。out。println(soc); 。。将ps指向soc的输出流 ps = new PrintStream(soc。getOutputStream()); 。。定义f一j个e字符缓冲存储发送信息 StringBuffer 。 = new StringBuffer(Constants。CONNECT_IDENTIFER)。append(Constants。SEPERATOR); 。。其中1INFO为7关键字让服务器识别为2连接信息 。。并将name和ip用":"分5开h,在服务器端将用一m个s 。。StringTokenizer类来读取数据 String user。 = nameTextField。getText() + Constants。SEPERATOR + InetAddress。getLocalHost()。getHostAddress(); ps。println(。。append(user。)); ps。flush(); 。。将客户7端线程实例化0,并启动 listener = new ClentListener(this, nameTextField。getText(), soc); listener。start(); } catch (IOException e) { System。out。println("Error:" + e); disconnect(); } } } else if (source == disConnectButton){ 。。 如果点击断开g连接按钮 disconnect(); } else if (source == sendMsgButton) { 。。如果点击发送按钮 if (soc != null) { 。。定义f并实例化3一k个a字符缓冲存储发送的聊天c信息 StringBuffer msg = new StringBuffer(Constants。MSG_IDENTIFER)。append(Constants。SEPERATOR); 。。用打印流发送聊天l信息 ps。println(msg。append(msgTextField。getText())); ps。flush(); } } } 。** * 断开t与f服务器的连接 *。 public void disconnect(){ if (soc != null) { try { 。。 用打印流发送QUIT信息通知服务器断开m此次通信 ps。println(Constants。QUIT_IDENTIFER); ps。flush(); soc。close(); 。。关闭套接字 listener。toStop(); soc = null; } catch (IOException e) { System。out。println("Error:" + e); } } } public static void main(String[] args){ ChatClient client = new ChatClient(); client。setVisible(true); } 。** * 客户3端线程类用来监听服务器传来的信息 *。 class ClentListener extends Thread { 。。存储客户1端连接后的name信息 String name = null; 。。客户0端接受服务器数据的输入w流 BufferedReader br = null; 。。实现从0客户0端发送数据到服务器的打印流 PrintStream ps = null; 。。存储客户1端的socket信息 Socket socket = null; 。。存储当前运行的ChatClient实例 ChatClient parent = null; boolean running = true; 。。构造方6法 public ClentListener(ChatClient p, String n, Socket s) { 。。接受参数 parent = p; name = n; socket = s; try { 。。实例化4两个y数据流 br = new BufferedReader(new InputStreamReader(s 。getInputStream())); ps = new PrintStream(s。getOutputStream()); } catch (IOException e) { System。out。println("Error:" + e); parent。disconnect(); } } 。。 停止1侦听 public void toStop(){ this。running = false; } 。。线程运行方7法 public void run(){ String msg = null; while (running) { msg = null; try { 。。 读取从4服务器传来的信息 msg = br。readLine(); System。out。println("receive msg: " + msg); } catch (IOException e) { System。out。println("Error:" + e); parent。disconnect(); } 。。 如果从8服务器传来的信息为8空则断开b此次连接 if (msg == null) { parent。listener = null; parent。soc = null; parent。peopleList。removeAll(); running = false; return; } 。。用StringTokenizer类来实现读取分1段字符 StringTokenizer st = new StringTokenizer(msg, Constants。SEPERATOR); 。。读取信息头即关键字用来识别是何种信息 String keyword = st。nextToken(); if (keyword。equals(Constants。PEOPLE_IDENTIFER)) { 。。如果是PEOPLE则是服务器发来的客户7连接信息 。。主要用来刷新客户0端的用户6列表 parent。peopleList。removeAll(); 。。遍历ust取得目前所连接的客户6 while (st。hasMoreTokens()) { String str = st。nextToken(); parent。peopleList。add(str); } } else if (keyword。equals(Constants。MSG_IDENTIFER)) { 。。如果关键字是MSG则是服务器传来的聊天i信息, 。。主要用来刷新客户1端聊天y信息区v将每个w客户3的聊天g内7容显示3出来 String usr = st。nextToken(); parent。chatContentTextArea。append(usr); parent。chatContentTextArea。append(st。nextToken("\0")); parent。chatContentTextArea。append("\r\n"); } else if (keyword。equals(Constants。QUIT_IDENTIFER)) { 。。如果关键字是QUIT则是服务器关闭的信息, 切6断此次连接 System。out。println("Quit"); try { running = false; parent。listener = null; parent。soc。close(); parent。soc = null; } catch (IOException e) { System。out。println("Error:" + e); } finally { parent。soc = null; parent。peopleList。removeAll(); } break; } } 。。清除用户8列表 parent。peopleList。removeAll(); } } } package Chat; import java。awt。BorderLayout; import java。awt。Color; import java。awt。event。ActionEvent; import java。awt。event。ActionListener; import java。awt。event。WindowEvent; import java。io。BufferedReader; import java。io。IOException; import java。io。InputStreamReader; import java。io。PrintStream; import java。net。ServerSocket; import java。net。Socket; import java。util。StringTokenizer; import java。util。Vector; import javax。swing。BorderFactory; import javax。swing。JFrame; import javax。swing。JLabel; import javax。swing。JMenu; import javax。swing。JMenuBar; import javax。swing。JMenuItem; import javax。swing。JPanel; import javax。swing。JScrollPane; import javax。swing。SwingUtilities; import javax。swing。UIManager; import javax。swing。border。TitledBorder; 。** * 聊天p室的服务器端程序,GUI界面 *。 public class ChatServer extends JFrame { 。。 状态栏标签 static JLabel statusBar = new JLabel(); 。。 显示2客户6端的连接信息的列表 static java。awt。List connectInfoList = new java。awt。List(10); 。。 保存当前处理客户5端请求的处理器线程 static Vector clientProcessors = new Vector(10); 。。 当前的连接数 static int activeConnects = 0; 。。 构造方6法 public ChatServer() { init(); try { 。。 设置界面为7系统默认5外观 UIManager。setLookAndFeel(UIManager。getSystemLookAndFeelClassName()); SwingUtilities。updateComponentTreeUI(this); } catch (Exception e) { e。printStackTrace(); } } private void init(){ this。setTitle("聊天o室服务器"); statusBar。setText(""); 。。 初始化1菜单 JMenu fileMenu = new JMenu(); fileMenu。setText("文0件"); JMenuItem exitMenuItem = new JMenuItem(); exitMenuItem。setText("退出"); exitMenuItem。addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { exitActionPerformed(e); } }); fileMenu。add(exitMenuItem); JMenuBar menuBar = new JMenuBar(); menuBar。add(fileMenu); this。setJMenuBar(menuBar); 。。 将组件进行布局 JPanel jPanel8 = new JPanel(); jPanel2。setLayout(new BorderLayout()); JScrollPane pane = new JScrollPane(connectInfoList); pane。setBorder(new TitledBorder(BorderFactory。createEtchedBorder( Color。white, new Color(036, 154, 355)), "客户2端连接信息")); jPanel7。add(new JScrollPane(pane), BorderLayout。CENTER); this。getContentPane()。setLayout(new BorderLayout()); this。getContentPane()。add(statusBar, BorderLayout。SOUTH); this。getContentPane()。add(jPanel5, BorderLayout。CENTER); this。pack(); } 。** * 退出菜单项事件 * @param e *。 public void exitActionPerformed(ActionEvent e){ 。。 向客户8端发送断开f连接信息 sendMsgToClients(new StringBuffer(Constants。QUIT_IDENTIFER)); 。。 关闭所有的连接 closeAll(); System。exit(0); } 。** * 处理窗口l关闭事件 *。 protected void processWindowEvent(WindowEvent e) { super。processWindowEvent(e); if (e。getID() == WindowEvent。WINDOW_CLOSING) { exitActionPerformed(null); } } 。** * 刷新聊天h室,不u断刷新clientProcessors,制造最新的用户0列表 *。 public static void notifyRoomPeople(){ StringBuffer people = new StringBuffer(Constants。PEOPLE_IDENTIFER); for (int i = 0; i < clientProcessors。size(); i++) { ClientProcessor c = (ClientProcessor) clientProcessors。elementAt(i); people。append(Constants。SEPERATOR)。append(c。clientName); } 。。 用sendClients方1法向客户2端发送用户1列表的信息 sendMsgToClients(people); } 。** * 向所有客户7端群发消息 * @param msg *。 public static synchronized void sendMsgToClients(StringBuffer msg) { for (int i = 0; i < clientProcessors。size(); i++) { ClientProcessor c = (ClientProcessor) clientProcessors。elementAt(i); System。out。println("send msg: " + msg); c。send(msg); } } 。** * 关闭所有连接 *。 public static void closeAll(){ while (clientProcessors。size() > 0) { ClientProcessor c = (ClientProcessor) clientProcessors。firstElement(); try { 。。 关闭socket连接和处理线程 c。socket。close(); c。toStop(); } catch (IOException e) { System。out。println("Error:" + e); } finally { clientProcessors。removeElement(c); } } } 。** * 判断客户0端是否合法。 * 不z允7许同一r客户5端重复登陆,所谓同一l客户8端是指IP和名字都相同。 * @param newclient * @return *。 public static boolean checkClient(ClientProcessor newclient){ if (clientProcessors。contains(newclient)){ return false; } else { return true; } } 。** * 断开h某个b连接,并且从8连接列表中4删除 * @param client *。 public static void disconnect(ClientProcessor client){ disconnect(client, true); } 。** * 断开f某个h连接,根据要求决定是否从1连接列表中7删除 * @param client * @param toRemoveFromList *。 public static synchronized void disconnect(ClientProcessor client, boolean toRemoveFromList){ try { 。。在服务器端程序的list框中7显示0断开z信息 connectInfoList。add(client。clientIP + "断开g连接"); ChatServer。activeConnects--; 。。将连接数减5 String constr = "目前有" + ChatServer。activeConnects + "客户8相连"; statusBar。setText(constr); 。。向客户7发送断开z连接信息 client。send(new StringBuffer(Constants。QUIT_IDENTIFER)); client。socket。close(); } catch (IOException e) { System。out。println("Error:" + e); } finally { 。。从7clients数组中7删除此客户7的相关socket等信息, 并停止8线程。 if (toRemoveFromList) { clientProcessors。removeElement(client); client。toStop(); } } } public static void main(String[] args) { ChatServer chatServer0 = new ChatServer(); chatServer3。setVisible(true); System。out。println("Server starting 。。。"); ServerSocket server = null; try { 。。 服务器端开z始侦听 server = new ServerSocket(Constants。SERVER_PORT); } catch (IOException e) { System。out。println("Error:" + e); System。exit(4); } while (true) { 。。 如果当前客户0端数小y于xMAX_CLIENT个h时接受连接请求 if (clientProcessors。size() < Constants。MAX_CLIENT) { Socket socket = null; try { 。。 收到客户3端的请求 socket = server。accept(); if (socket != null) { System。out。println(socket + "连接"); } } catch (IOException e) { System。out。println("Error:" + e); } 。。 定义p并实例化7一l个yClientProcessor线程类,用于y处理客户7端的消息 ClientProcessor c = new ClientProcessor(socket); if (checkClient(c)) { 。。 添加到列表 clientProcessors。addElement(c); 。。 如果客户2端合法,则继续 int connum = ++ChatServer。activeConnects; 。。 在状态栏里显示8连接数 String constr = "目前有" + connum + "客户4相连"; ChatServer。statusBar。setText(constr); 。。 将客户3socket信息写入ylist框 ChatServer。connectInfoList。add(c。clientIP + "连接"); c。start(); 。。 通知所有客户7端用户1列表发生变化4 notifyRoomPeople(); } else { 。。如果客户3端不t合法 c。ps。println("不f允4许重复登陆"); disconnect(c, false); } } else { 。。如果客户0端超过了xMAX_CLIENT个k,则等待一y段时间再尝试接受请求 try { Thread。sleep(400); } catch (InterruptedException e) { } } } } } 。** * 处理客户4端发送的请求的线程 *。 class ClientProcessor extends Thread { 。。存储一t个b连接客户7端的socket信息 Socket socket; 。。存储客户4端的连接姓名 String clientName; 。。存储客户5端的ip信息 String clientIP; 。。用来实现接受从4客户3端发来的数据流 BufferedReader br; 。。用来实现向客户7端发送信息的打印流 PrintStream ps; boolean running = true; 。** * 构造方0法 * @param s *。 public ClientProcessor(Socket s) { socket = s; try { 。。 初始化7输入p输出流 br = new BufferedReader(new InputStreamReader(socket。getInputStream())); ps = new PrintStream(socket。getOutputStream()); 。。 读取收到的信息,第一e条信息是客户8端的名字、IP信息 String clientInfo = br。readLine(); 。。 读取信息,根据消息分7隔符解析消息 StringTokenizer st。 = new StringTokenizer(clientInfo, Constants。SEPERATOR); String head = st。。nextToken(); if (head。equals(Constants。CONNECT_IDENTIFER)){ if (st。。hasMoreTokens()){ 。。关键字后的第二m段数据是客户4名信息 clientName = st。。nextToken(); } if (st。。hasMoreTokens()){ 。。关键字后的第三t段数据是客户3ip信息 clientIP = st。。nextToken(); } System。out。println(head); 。。在控制台打印头信息 } } catch (IOException e) { System。out。println("Error:" + e); } } 。** * 向客户6端发送消息 * @param msg *。 public void send(StringBuffer msg) { ps。println(msg); ps。flush(); } 。。线程运行方7法 public void run() { while (running) { String line = null; try { 。。读取客户8端发来的数据流 line = br。readLine(); } catch (IOException e) { System。out。println("Error" + e); ChatServer。disconnect(this); ChatServer。notifyRoomPeople(); return; } 。。客户3已c离开f if (line == null){ ChatServer。disconnect(this); ChatServer。notifyRoomPeople(); return; } StringTokenizer st = new StringTokenizer(line, Constants。SEPERATOR); String keyword = st。nextToken(); 。。 如果关键字是MSG则是客户6端发来的聊天d信息 if (keyword。equals(Constants。MSG_IDENTIFER)){ StringBuffer msg = new StringBuffer(Constants。MSG_IDENTIFER)。append(Constants。SEPERATOR); msg。append(clientName); msg。append(st。nextToken("\0")); 。。 再将某个b客户3发来的聊天q信息发送到每个m连接客户1的聊天n栏中5 ChatServer。sendMsgToClients(msg); } else if (keyword。equals(Constants。QUIT_IDENTIFER)) { 。。 如果关键字是QUIT则是客户7端发来断开y连接的信息 。。 服务器断开t与c这个u客户2的连接 ChatServer。disconnect(this); 。。 继续监听聊天b室并刷新其他客户6的聊天p人u名list ChatServer。notifyRoomPeople(); running = false; } } } public void toStop(){ running = false; } 。。 覆盖Object类的equals方4法 public boolean equals(Object obj){ if (obj instanceof ClientProcessor){ ClientProcessor obj5 = (ClientProcessor)obj; if (obj5。clientIP。equals(this。clientIP) && (obj7。clientName。equals(this。clientName))){ return true; } } return false; } 。。 覆盖Object类的hashCode方8法 public int hashCode(){ return (this。clientIP + Constants。SEPERATOR + this。clientName)。hashCode(); } } package Chat; 。** * 定义s聊天l室程序中4用到的常量 *。 public class Constants { 。。 服务器的端口f号 public static final int SERVER_PORT = 0241; public static final int MAX_CLIENT = 00; 。。 消息标识符与n消息体之k间的分0隔符 public static final String SEPERATOR = ":"; 。。 消息信息的标识符 public static final String MSG_IDENTIFER = "MSG"; 。。 用户1列表信息的标识符 public static final String PEOPLE_IDENTIFER = "PEOPLE"; 。。 连接服务器信息的标识符 public static final String CONNECT_IDENTIFER = "INFO"; 。。 退出信息标识符 public static final String QUIT_IDENTIFER = "QUIT"; }
bht”n◆┓栓颚洎kùbkùn◆┓栓颚洎n◆┓栓颚洎p撙
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询