Java实现聊天室界面

本文实例为大家分享了Java实现聊天室界面的具体代码,供大家参考,具体内容如下

服务器端:

package Server;
 
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JList;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
 
public class ServerFrame extends JFrame implements ActionListener {
 
    private JButton jbt_start;
    private JButton jbt_stop;
    private JButton jbt_exit;
    private JTextArea jta_disMess;
    private JList jlt_disUsers;
 
    private Server server;
 
    public List online_usernames;
    public List online_usernameids;
 
    public ServerFrame(Server server) {
        this.server = server;
        online_usernames = new ArrayList();
        online_usernameids = new ArrayList();
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
        setTitle("\u670D\u52A1\u5668");
        setIconImage(Toolkit.getDefaultToolkit().getImage("Images/socket.jpg"));
        setSize(449, 301);
        setResizable(false);
        WinCenter.center(this);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent arg0) {
                jbt_exit.doClick();
            }
        });
        getContentPane().setLayout(null);
 
        jbt_start = new JButton("\u542F\u52A8\u670D\u52A1\u5668");
        jbt_start.setBounds(32, 23, 103, 34);
        jbt_start.addActionListener(this);
        getContentPane().add(jbt_start);
 
        jbt_stop = new JButton("\u505C\u6B62\u670D\u52A1\u5668");
        jbt_stop.setBounds(145, 23, 103, 34);
        jbt_stop.setEnabled(false);
        jbt_stop.addActionListener(this);
        getContentPane().add(jbt_stop);
 
        jbt_exit = new JButton("\u9000\u51FA\u670D\u52A1\u5668");
        jbt_exit.setBounds(258, 23, 103, 34);
        jbt_exit.addActionListener(this);
        getContentPane().add(jbt_exit);
 
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(10, 64, 221, 192);
        scrollPane.setWheelScrollingEnabled(true);
        scrollPane.setBorder(BorderFactory.createTitledBorder("聊天消息"));
        getContentPane().add(scrollPane);
 
        jta_disMess = new JTextArea();
        scrollPane.setViewportView(jta_disMess);
 
        JScrollPane scrollPane_1 = new JScrollPane();
        scrollPane_1.setBounds(258, 65, 157, 191);
        scrollPane_1.setBorder(BorderFactory.createTitledBorder("在线用户"));
        getContentPane().add(scrollPane_1);
 
        jlt_disUsers = new JList();
        jlt_disUsers.setVisibleRowCount(4);
        scrollPane_1.setViewportView(jlt_disUsers);
    }
 
    /**
     *
     */
    private static final long serialVersionUID = 1L;
 
    @Override
    public void actionPerformed(ActionEvent arg0) {
        if (arg0.getSource() == jbt_start) {
            jbt_start.setEnabled(false);
            jbt_stop.setEnabled(true);
            server.startServer();
        }
        if (arg0.getSource() == jbt_stop) {
            int flag = JOptionPane.showConfirmDialog(this, "是否要停止服务器?", "",
                    JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
            if (flag == JOptionPane.OK_OPTION) {
                server.stopServer();
                jbt_start.setEnabled(true);
                jbt_stop.setEnabled(false);
            }
        }
        if (arg0.getSource() == jbt_exit) {
            if (jbt_stop.isEnabled()) {
                jbt_stop.doClick();
            }
            server.close();
        }
    }
 
    public void setDisUsers(String userNames) {
        if (userNames.equals("@userlist")) {
            jlt_disUsers.removeAll();
            String[] user_null = new String[]{};
            jlt_disUsers.setListData(user_null);
        } else {
            if (userNames.contains("@userlist")) {
                String[] dis = userNames.split("@userlist");
                String[] disUsernames = new String[dis.length / 2];
                int j = 0;
                for (int i = 0; i < dis.length; i++) {
                    disUsernames[j++] = dis[i++];
                }
                jlt_disUsers.removeAll();
                jlt_disUsers.setListData(disUsernames);
            }
            if (userNames.contains("@exit")) {
                String[] dis = {};
                jlt_disUsers.setListData(dis);
            }
        }
    }
 
    public void setDisMess(String message) {
        if (message.contains("@chat")) {
            int local = message.indexOf("@chat");
            jta_disMess.append(message.substring(0, local) + "\n");
            jta_disMess.setCaretPosition(jta_disMess.getText().length());
        }
        if (message.contains("@exit")) {
            jta_disMess.setText("");
        }
    }
 
    public void setStartAndStopUnable() {
        JOptionPane.showMessageDialog(this, "不能同时开启两个服务器");
        jbt_start.setEnabled(false);
        jbt_stop.setEnabled(false);
    }
}

设置窗口居中代码:

package Server;
 
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.Window;
 
public class WinCenter {
    public static void center(Window win) {
        Toolkit tkit = Toolkit.getDefaultToolkit();
        Dimension sSize = tkit.getScreenSize();
        Dimension wSize = win.getSize();
        if (wSize.height > sSize.height) {
            wSize.height = sSize.height;
        }
        if (wSize.width > sSize.width) {
            wSize.width = sSize.width;
        }
        win.setLocation((sSize.width - wSize.width) / 2, (sSize.height - wSize.height) / 2);
    }
}

客户端:

登录界面

package Client;
 
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
 
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.Inet4Address;
import java.net.UnknownHostException;
 
import javax.swing.JTextField;
import javax.swing.JButton;
 
public class Client_enterFrame extends JFrame implements ActionListener, KeyListener {
    public Client_enterFrame(Client client) {
        this.client = client;
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        } catch (InstantiationException e1) {
            e1.printStackTrace();
        } catch (IllegalAccessException e1) {
            e1.printStackTrace();
        } catch (UnsupportedLookAndFeelException e1) {
            e1.printStackTrace();
        }
        setIconImage(Toolkit.getDefaultToolkit().getImage("Images/socket.jpg"));
        setTitle("\u804A\u5929\u5BA4");
        getContentPane().setLayout(null);
        setSize(296, 249);
        WinCenter.center(this);
        setResizable(false);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                jbt_exit.doClick();
            }
        });
 
        JLabel lblNewLabel = new JLabel("\u7528\u6237\u540D");
        lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 14));
        lblNewLabel.setBounds(23, 30, 81, 34);
        getContentPane().add(lblNewLabel);
 
        jtf_username = new JTextField();
        jtf_username.addKeyListener(this);
        jtf_username.setBounds(114, 30, 143, 34);
        getContentPane().add(jtf_username);
        jtf_username.setColumns(10);
 
        JLabel lblNewLabel_1 = new JLabel("\u670D\u52A1\u5668\u5730\u5740");
        lblNewLabel_1.setFont(new Font("宋体", Font.PLAIN, 14));
        lblNewLabel_1.setBounds(23, 74, 81, 34);
        getContentPane().add(lblNewLabel_1);
 
        jtf_hostIp = new JTextField();
        jtf_hostIp.setBounds(114, 74, 143, 34);
        jtf_hostIp.addKeyListener(this);
        getContentPane().add(jtf_hostIp);
        try {
            String ip = (String) Inet4Address.getLocalHost().getHostAddress();
            jtf_hostIp.setText(ip);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        jtf_hostIp.setColumns(10);
 
        JLabel lblNewLabel_2 = new JLabel("\u7AEF\u53E3\u53F7");
        lblNewLabel_2.setFont(new Font("宋体", Font.PLAIN, 14));
        lblNewLabel_2.setBounds(23, 118, 81, 34);
        getContentPane().add(lblNewLabel_2);
 
        jtf_hostPort = new JTextField();
        jtf_hostPort.addKeyListener(this);
        jtf_hostPort.setBounds(114, 118, 143, 34);
        getContentPane().add(jtf_hostPort);
        jtf_hostPort.setText("5000");
        jtf_hostPort.setColumns(10);
 
        jbt_enter = new JButton("\u8FDB\u5165\u804A\u5929\u5BA4");
        jbt_enter.addActionListener(this);
        jbt_enter.addKeyListener(this);
        jbt_enter.setFont(new Font("宋体", Font.PLAIN, 14));
        jbt_enter.setBounds(23, 162, 108, 39);
        getContentPane().add(jbt_enter);
 
        jbt_exit = new JButton("\u9000\u51FA\u804A\u5929\u5BA4");
        jbt_exit.setFont(new Font("宋体", Font.PLAIN, 14));
        jbt_exit.setBounds(144, 162, 113, 39);
        jbt_exit.addActionListener(this);
        getContentPane().add(jbt_exit);
    }
 
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private JTextField jtf_username;
    private JTextField jtf_hostIp;
    private JTextField jtf_hostPort;
    private JButton jbt_enter;
    private JButton jbt_exit;
    private Client client;
 
 
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == jbt_exit) {
            setVisible(false);
            client.exitLogin();
        }
        if (e.getSource() == jbt_enter) {
            String username = jtf_username.getText();
            username.trim();
            String hostIp = jtf_hostIp.getText();
            hostIp.trim();
            String hostPort = jtf_hostPort.getText();
            hostPort.trim();
            if (!username.equals("")) {
                if (!hostIp.equals("")) {
                    if (!hostPort.equals("")) {
                        String login_mess = client.login(username, hostIp, hostPort);
                        if (login_mess.equals("true")) {
                            this.setVisible(false);
                            client.showChatFrame(username);
                        } else {
                            JOptionPane.showMessageDialog(this, login_mess);
                        }
                    } else {
                        JOptionPane.showMessageDialog(this, "服务器连接端口号不能为空!");
                    }
                } else {
                    JOptionPane.showMessageDialog(this, "服务器地址不能为空!");
                }
            } else {
                JOptionPane.showMessageDialog(this, "用户名不能为空!");
            }
        }
    }
 
    @Override
    public void keyPressed(KeyEvent arg0) {
        if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
            jbt_enter.doClick();
        }
    }
 
    @Override
    public void keyReleased(KeyEvent arg0) {
    }
 
    @Override
    public void keyTyped(KeyEvent arg0) {
    }
}

聊天主界面

package Client;
 
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
 
public class Client_chatFrame extends JFrame implements ActionListener,
        KeyListener, ListSelectionListener {
    public Client_chatFrame(Client client, String title) {
        this.client = client;
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
        setIconImage(Toolkit.getDefaultToolkit().getImage("Images/socket.jpg"));
        setTitle("\u804A\u5929\u5BA4" + "  " + title);
        setSize(450, 325);
        WinCenter.center(this);
        setResizable(false);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent arg0) {
                jbt_exit.doClick();
            }
        });
        getContentPane().setLayout(null);
 
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBorder(BorderFactory.createTitledBorder("聊天消息"));
        scrollPane.setBounds(10, 10, 283, 167);
        scrollPane.setWheelScrollingEnabled(true);
        getContentPane().add(scrollPane);
 
        jta_disMess = new JTextArea();
        jta_disMess.setEditable(false);
        scrollPane.setViewportView(jta_disMess);
 
        jtf_inputMess = new JTextField();
        jtf_inputMess.addKeyListener(this);
        jtf_inputMess.setBounds(10, 242, 192, 32);
        getContentPane().add(jtf_inputMess);
        jtf_inputMess.setColumns(10);
 
        jbt_trans = new JButton("\u53D1  \u9001");
        jbt_trans.setFont(new Font("宋体", Font.PLAIN, 14));
        jbt_trans.setBounds(212, 241, 93, 32);
        jbt_trans.addActionListener(this);
        getContentPane().add(jbt_trans);
 
        jbt_clear = new JButton("\u6E05\u9664\u804A\u5929\u8BB0\u5F55");
        jbt_clear.setFont(new Font("宋体", Font.PLAIN, 14));
        jbt_clear.setBounds(158, 187, 135, 37);
        jbt_clear.addActionListener(this);
        getContentPane().add(jbt_clear);
 
        jbt_exit = new JButton("\u9000\u51FA\u804A\u5929\u5BA4");
        jbt_exit.setFont(new Font("宋体", Font.PLAIN, 14));
        jbt_exit.setBounds(20, 189, 128, 37);
        jbt_exit.addActionListener(this);
        getContentPane().add(jbt_exit);
 
        scrollPane_1 = new JScrollPane();
        scrollPane_1.setBorder(BorderFactory.createTitledBorder("在线用户"));
        scrollPane_1.setBounds(303, 10, 128, 214);
        getContentPane().add(scrollPane_1);
 
        jlt_disUsers = new JList();
        jlt_disUsers.setVisibleRowCount(4);
        jlt_disUsers.setSelectedIndex(0);
        jlt_disUsers
                .setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        jlt_disUsers.addListSelectionListener(this);
        scrollPane_1.setViewportView(jlt_disUsers);
 
        jbt_singlChat = new JButton("\u5355\u4EBA\u804A\u5929");
        jbt_singlChat.setBounds(315, 241, 116, 32);
        jbt_singlChat.addActionListener(this);
        getContentPane().add(jbt_singlChat);
    }
 
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private JTextField jtf_inputMess;
    private JTextArea jta_disMess;
    private JButton jbt_trans;
    private JButton jbt_clear;
    private JButton jbt_exit;
    private JList jlt_disUsers;
    private JButton jbt_singlChat;
    private JScrollPane scrollPane_1;
    private Client client;
 
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == jbt_clear) {
            jta_disMess.setText("");
        }
        if (e.getSource() == jbt_trans) {
            String mess = jtf_inputMess.getText();
            mess.trim();
            jtf_inputMess.setText("");
            if (mess.equals("")) {
                JOptionPane.showMessageDialog(this, "不能发送空消息");
                jtf_inputMess.setText("");
            } else {
                client.transMess(mess);
            }
        }
        if (e.getSource() == jbt_exit) {
            if (JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(this,
                    "是否确定要退出聊天室?", "提示", JOptionPane.OK_CANCEL_OPTION)) {
                this.setVisible(false);
                client.exitChat();
                System.exit(0);
            }
        }
        if (e.getSource() == jbt_singlChat) {
            String user_names = (String) jlt_disUsers.getSelectedValue();
            if (user_names == null) {
                JOptionPane.showMessageDialog(this, "您未选择聊天对象\n请选择要单独聊天的对象");
            } else {
                if (!client.c_singleFrames.containsKey(user_names)) {
                    createSingleChatFrame(user_names);
                } else {
                    client.c_singleFrames.get(user_names)
                            .setFocusableWindowState(true);
                }
            }
        }
    }
 
    @Override
    public void keyPressed(KeyEvent arg0) {
        if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
            if (arg0.getSource() == jtf_inputMess) {
                jbt_trans.doClick();
            }
        }
    }
 
    @Override
    public void keyReleased(KeyEvent arg0) {
    }
 
    @Override
    public void keyTyped(KeyEvent arg0) {
    }
 
    public void setDisMess(String substring) {
        int local = substring.indexOf("@chat");
        jta_disMess.append(substring.substring(0, local) + "\n");
        jta_disMess.setCaretPosition(jta_disMess.getText().length());
    }
 
    public void setDisUsers(String chat_re) {
        String[] infos = chat_re.split("@userlist");
        String[] info = new String[infos.length / 2];
        for (int i = 1; i < infos.length; i++) {
            int id_user = 0;
            try {
                id_user = Integer.parseInt(infos[i]);
                if (client.getThreadID() == id_user) {
                    if (!client.username.equals(infos[i - 1])) {
                        JOptionPane.showMessageDialog(this,
                                "由于有同名的用户登录,所以您的用户名后面加上了编号");
                        client.username = infos[i - 1];
                        this.setTitle("聊天室    " + client.username);
                        break;
                    } else {
                        break;
                    }
                } else {
                    i++;
                }
            } catch (Exception e) {
            }
        }
        if (infos.length == 2) {
            String[] s = new String[]{};
            if (!client.c_singleFrames.isEmpty()) {
                ListModel list = jlt_disUsers.getModel();
                for (int i = 0; i < list.getSize(); i++) {
                    if (client.c_singleFrames.get(list.getElementAt(i)) != null) {
                        client.c_singleFrames.get(list.getElementAt(i))
                                .setExitNotify();
                    }
                }
            }
            jlt_disUsers.removeAll();
            jlt_disUsers.setListData(s);
        } else {
            if ((infos.length / 2 - 1) < client.username_online.size()) {
                // 有人下线
                List rec = new ArrayList();
                int i = 0;
                for (; i < infos.length; i++) {
                    rec.add(0, infos[i++]);
                }
                for (i = 0; i < client.username_online.size(); i++) {
                    if (!rec.contains(client.username_online.get(i))) {
                        break;
                    }
                }
                String name = client.username_online.get(i);
                client.username_online.remove(i);
                try {
                    client.clientuserid.remove(i);
                } catch (Exception e) {
                    e.printStackTrace();
                }
 
                if (client.c_singleFrames.containsKey(name)) {
                    client.c_singleFrames.get(name).closeSingleFrame();
                    client.c_singleFrames.remove(name);
                }
            } else {
                List online = new ArrayList();
                for (int i = 0; i < client.username_online.size(); i++) {
                    online.add(0, client.clientuserid.get(i));
                }
                if (online.isEmpty()) {
                    for (int i = 1; i < infos.length; i++) {
                        if ((int) Integer.parseInt(infos[i]) != client
                                .getThreadID()) {
                            client.username_online.add(0, infos[i - 1]);
                            client.clientuserid.add(0,
                                    Integer.parseInt(infos[i]));
                        }
                        i++;
                    }
                } else {
                    for (int i = 1; i < infos.length; i++) {
                        if (Integer.parseInt(infos[i]) != client.getThreadID()) {
                            if (!online.contains(Integer.parseInt(infos[i]))) {
                                client.username_online.add(0, infos[i - 1]);
                                client.clientuserid.add(0,
                                        Integer.parseInt(infos[i]));
                            } else {
                                String name = client.username_online
                                        .get(client.clientuserid
                                                .indexOf(Integer
                                                        .parseInt(infos[i])));
                                if (!name.equals(infos[i - 1])) {
                                    if (client.c_singleFrames.containsKey(name)) {
                                        Client_singleFrame cf = client.c_singleFrames
                                                .get(name);
                                        cf.setTitle(name);
                                        client.c_singleFrames.remove(name);
                                        client.c_singleFrames.put(name, cf);
                                        cf.setVisible(false);
 
                                    }
                                    client.username_online.remove(name);
                                    client.clientuserid.remove(new Integer(
                                            Integer.parseInt(infos[i])));
                                    client.username_online.add(0, infos[i - 1]);
                                    client.clientuserid.add(0,
                                            Integer.parseInt(infos[i]));
                                }
                            }
                        }
                        i++;
                    }
                }
 
            }
            try {
                for (int i = 0; i < client.username_online.size(); i++) {
                    info[i] = client.username_online.get(i);
                }
 
            } catch (Exception e) {
            }
            jlt_disUsers.removeAll();
            jlt_disUsers.setListData(info);
        }
    }
 
    public void closeClient() {
        JOptionPane.showMessageDialog(this, "服务器已关闭", "提示",
                JOptionPane.OK_OPTION);
        client.exitClient();
        setVisible(false);
    }
 
    @Override
    public void valueChanged(ListSelectionEvent e) {
        if (e.getSource() == jlt_disUsers) {
        }
    }
 
    public void createSingleChatFrame(String name) {
        Client_singleFrame c_singlFrame = new Client_singleFrame(client, name);
        client.c_singleFrames.put(name, c_singlFrame);
        try {
            c_singlFrame.userThreadID = client.clientuserid
                    .get(client.username_online.indexOf(name));
        } catch (Exception e) {
        }
 
        c_singlFrame.setVisible(true);
    }
 
    public void setSingleFrame(String chat_re) {
        String[] infos = chat_re.split("@single");
        try {
            if (client.c_singleFrames.containsKey(infos[0])) {
                client.c_singleFrames.get(infos[0]).setDisMess(infos[3]);
            } else {
                createSingleChatFrame(infos[0]);
                client.c_singleFrames.get(infos[0]).setDisMess(infos[3]);
            }
        } catch (Exception e) {
        }
    }
}

单人聊天界面

package Client;
 
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
 
public class Client_singleFrame extends JFrame implements ActionListener, KeyListener {
 
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private static JTextArea jta_disMess;
    private JTextField jtf_inputMess;
    private JButton jbt_trans;
 
    public int userThreadID = 0;
 
    private Client client;
 
    public Client_singleFrame(Client client, String title) {
        this.client = client;
        init(title);
    }
 
    private void init(String title) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        } catch (InstantiationException e1) {
            e1.printStackTrace();
        } catch (IllegalAccessException e1) {
            e1.printStackTrace();
        } catch (UnsupportedLookAndFeelException e1) {
            e1.printStackTrace();
        }
        setIconImage(Toolkit.getDefaultToolkit().getImage("Images/socket.jpg"));
        WinCenter.center(this);
        setTitle(title);
        setSize(400, 400);
        setResizable(false);
        setContentPane(createContentPanel());
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                closeSingleFrame();
            }
        });
    }
 
    private Container createContentPanel() {
        JPanel jp = new JPanel();
        jp.setBorder(BorderFactory.createTitledBorder("聊天消息"));
        jp.setLayout(new BorderLayout());
        jta_disMess = new JTextArea();
        jta_disMess.setEditable(false);
        jp.add(BorderLayout.CENTER, new JScrollPane(jta_disMess));
        jp.add(BorderLayout.SOUTH, createInput());
        return jp;
    }
 
    private Component createInput() {
        JPanel jp = new JPanel();
        jp.setBorder(BorderFactory.createTitledBorder("发送消息"));
        jp.setLayout(new BorderLayout());
        jtf_inputMess = new JTextField();
        jtf_inputMess.addKeyListener(this);
        jbt_trans = new JButton("发送");
        jbt_trans.addActionListener(this);
        jp.add(jtf_inputMess, BorderLayout.CENTER);
        jp.add(jbt_trans, BorderLayout.EAST);
        return jp;
    }
 
    @Override
    public void keyPressed(KeyEvent arg0) {
        if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
            if (arg0.getSource() == jtf_inputMess) {
                jbt_trans.doClick();
            }
        }
    }
 
    @Override
    public void keyReleased(KeyEvent arg0) {
    }
 
    @Override
    public void keyTyped(KeyEvent arg0) {
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == jbt_trans) {
            String str = jtf_inputMess.getText();
            str.trim();
            jtf_inputMess.setText("");
            if (str.equals("")) {
                JOptionPane.showMessageDialog(this, "信息不能为空");
            } else {
                SimpleDateFormat form = new SimpleDateFormat("yyyy-MM-dd  HH:mm");
                String date = form.format(new Date());
                String mess = client.username + "  " + date + "\n" + str;
                jta_disMess.append(mess + "\n");
                jta_disMess.setCaretPosition(jta_disMess.getText().length());
                int index = client.username_online.indexOf(this.getTitle());
                String info = client.username + "@single" + client.getThreadID() + "@single" +
                        (int) client.clientuserid.get(index) + "@single" +
                        mess + "@single";
                try {
                    client.dos.writeUTF(info);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }
 
    public void setDisMess(String chat_re) {
        jta_disMess.append(chat_re + "\n");
        jta_disMess.setCaretPosition(jta_disMess.getText().length());
    }
 
    public void closeSingleFrame() {
        client.c_singleFrames.remove(this.getTitle());
        setVisible(false);
    }
 
    public void setExitNotify() {
        jta_disMess.append(this.getTitle() + "已下线.....");
        jbt_trans.setEnabled(false);
    }
}

设置窗体居中

package Client;
 
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.Window;
 
public class WinCenter {
    public static void center(Window win) {
        Toolkit tkit = Toolkit.getDefaultToolkit();
        Dimension sSize = tkit.getScreenSize();
        Dimension wSize = win.getSize();
        if (wSize.height > sSize.height) {
            wSize.height = sSize.height;
        }
        if (wSize.width > sSize.width) {
            wSize.width = sSize.width;
        }
        win.setLocation((sSize.width - wSize.width) / 2, (sSize.height - wSize.height) / 2);
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

你可能感兴趣的:(Java实现聊天室界面)