package ChataRoom.UI;
import ChataRoom.Client;
import ChataRoom.MyServer;
import ChataRoom.Server_Runnable;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.util.ArrayList;
public class ClientJFrame extends JFrame implements ActionListener, KeyListener {
// public static void main(String[] args) {
// new ClientJFrame();
// }
Client client = null;
public JTextArea chatHistory;
JTextField messageInput;
JButton sendButton;
String name;
ClientJFrame clientJFrame = this;
DefaultListModel<String> userListModel;
public ClientJFrame() {
initJFrame();
initView();
initName();
setVisible(true);
initSocket();
}
public void initOnlineUsers() {
//报错点,执行了构造函数
//ArrayList<String> onlineUsers = MyServer.getMyServer().onlineUsers;
ArrayList<String> onlineUsers = MyServer.onlineUsers;
System.out.println("Client 54行"+onlineUsers);
userListModel.clear();
userListModel.addElement("在线人数:"+onlineUsers.size());
userListModel.addElement("什么群");
for (String name : onlineUsers) {
userListModel.addElement(name);
}
int size = userListModel.size();
System.out.println(size);
}
private void initName() {
// 创建一个输入对话框,提示用户输入用户名
String userName = JOptionPane.showInputDialog(this, "请输入您的用户名:");
// 确保用户名不是空的
if (userName == null || userName.trim().isEmpty()) {
JOptionPane.showMessageDialog(this, "用户名不能为空,请重新输入。", "警告", JOptionPane.WARNING_MESSAGE);
// 如果用户名为空,可以再次调用此方法,或者根据具体需求处理
// 这里简单示例,直接返回null表示输入无效
return;
}
this.name = userName;
}
private void initSocket() {
// 创建客户端对象
client = new Client();
// 创建接收服务器消息的线程
new Thread(new Server_Runnable(client.socket,clientJFrame)).start();
client.out.println(name);
//把当前对象添加到服务器的集合中
//MyServer.getMyServer().addClientJFrame(clientJFrame);
MyServer.addClientJFrame(clientJFrame);
initOnlineUsers();
}
private void initView() {
// 创建左边面板保持不变
JPanel leftPanel = new JPanel();
// leftPanel.setLayout(new FlowLayout());
leftPanel.setLayout(new BorderLayout());
// 创建在线用户列表
userListModel = new DefaultListModel<>();
//userListModel.addElement("什么群");
JList<String> userList = new JList<>(userListModel);
userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane userListScroll = new JScrollPane(userList);
leftPanel.add(userListScroll, BorderLayout.CENTER);
// 右边面板现在将包含聊天区域和输入区域
JPanel rightPanel = new JPanel();
rightPanel.setLayout(new BorderLayout()); // 使用边界布局管理器
// 聊天历史显示区
chatHistory = new JTextArea();
chatHistory.append("欢迎来到聊天室!\n");
chatHistory.setBackground(Color.white);
chatHistory.setForeground(Color.black);
chatHistory.setFont(new Font("宋体", Font.PLAIN, 14));
chatHistory.setEditable(false); // 确保用户不能编辑聊天历史
JScrollPane historyScroll = new JScrollPane(chatHistory);
historyScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); // 始终显示垂直滚动条
rightPanel.add(historyScroll, BorderLayout.CENTER);
// 输入区
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.LINE_AXIS)); // 水平布局
// 输入框
messageInput = new JTextField();
messageInput.addKeyListener(this);
// 发送按钮
sendButton = new JButton("发送");
sendButton.addActionListener(this);
inputPanel.add(messageInput);
inputPanel.add(sendButton);
rightPanel.add(inputPanel, BorderLayout.SOUTH); // 底部放置输入面板
// 使用JSplitPane,这里我们假设不需要调整分隔条位置,因为聊天区域和输入区域上下布局
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel);
// 根据需要调整分隔条的初始位置,例如:
splitPane.setDividerLocation(100);
splitPane.setDividerSize(2);
splitPane.setResizeWeight(0.7); // 控制分割比例,这里70%给上方(聊天历史)
// 添加splitPane到JFrame
getContentPane().add(splitPane);
}
private void initJFrame() {
//设置界面标题
setTitle("客户端");
//设置界面大小
setSize(600,400);
//设置界面置顶
this.setAlwaysOnTop(false);
//使窗口居中显示
this.setLocationRelativeTo(null);
//设置关闭模式,关闭前弹出确认框
this.setDefaultCloseOperation(this.DO_NOTHING_ON_CLOSE);
//添加关闭窗口确认事件
confirmCloseWindows();
//取消默认居中模式,只有取消了才会添加XY轴的组件
//this.setLayout(null);
}
private void confirmCloseWindows() {
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int result = JOptionPane.showConfirmDialog(null, "是否退出系统?", "提示", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
// 关闭当前客户端后,从服务器的集合删除此对象
new Thread(new Runnable() {
@Override
public void run() {
MyServer.removeClientJFrame(clientJFrame);
}
}).start();
System.exit(0);
}
}
});
//关闭输出流,关闭socket连接
if (client != null){
client.out.close();
try {
if (client.socket != null){
client.socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (client == null) {
JOptionPane.showMessageDialog(this, "客户端未准备好,请稍候重试。");
return;
}
Object obj = e.getSource();
if (obj == sendButton){
System.out.println("点击了发送");
sendMessage();
}
}
private void sendMessage() {
String message = messageInput.getText();
if (message.equals("")){
JOptionPane.showMessageDialog(null, "消息不能为空");
}else {
client.sendMessageToServer(message);
chatHistory.append("我:"+ message +"\n");
messageInput.setText("");
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (ke
LearnTech_123
- 粉丝: 406
- 资源: 4
最新资源
- COMSOL蛇形流道燃料电池pemfc,温度、液态水、膜态水均有考虑,阳极通入氢气,阴极通入空气,物理模型包含双极板,液态水做了
- 基于Python的A++系统管家设计源码
- 基于Python的初学者HTML网页爬虫设计源码实践
- 光伏超级电容与蓄电池混合储能系统能量管理仿真 仿真模型+参考文献+注释 1光伏Boost:MPPT采用扰动观察法实现最大功率
- 基于Python和Shell语言的公开接口API设计源码
- 基于Java实现的中介者模式设计源码分析
- 基于Vue3的SpringBoot+Vue前后端分离仓库管理系统设计源码
- 经典文献复现:孤岛划分,最优断面相关 题目:考虑频率及电压稳定约束的主动解列最优断面搜索方法 最新复现,全网独一份,接相关代码定
- 基于Java语言的机试题设计源码示例
- 基于Java开发的相亲系统设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈