📄 clientframe.java
字号:
package com.chat.client;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.StyledDocument;
import main.ClientMainClass;
import com.chat.constants.ClientConstants;
import com.chat.dto.MsgDTO1;
import com.chat.io.TxtManager;
import com.chat.util.FontDialog;
@SuppressWarnings("serial")
public class ClientFrame extends JFrame implements Runnable {
private JComboBox cbxUserId;
private DefaultComboBoxModel cbxModel =new DefaultComboBoxModel();
private Socket socket;
private ObjectInputStream ois;
private ObjectOutputStream oos;
private boolean isConnected = false;
private JTextPane txtDownMsg;
private JTextPane txtUpMsg;
private MsgDTO1 tempMsgDTO=new MsgDTO1();
private StyledDocument doc;
private String ip="127.0.0.1";
private int port=8888;
public static void main(String args[]) {
try {
ClientFrame frame = new ClientFrame(args[0],args[1],args[2]);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Create the frame
*/
public ClientFrame() {
super();
}
public ClientFrame(String userId,String ip,String port) {
super();
this.tempMsgDTO.setUserId(userId);
this.ip=ip;
this.port=Integer.parseInt(port);
getContentPane().setLayout(null);
setTitle("Java聊天室-客户端 "+"用户: "+this.tempMsgDTO.getUserId()+" 当前在线");
setBounds(100, 100, 553, 472);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
final JMenu menu_4 = new JMenu();
menu_4.setText("制作说明(H)");
menuBar.add(menu_4);
final JMenuItem btnAbout = new JMenuItem();
btnAbout.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
About.main(new String[0]);
}
});
btnAbout.setText("关于......");
menu_4.add(btnAbout);
final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 43, 442, 191);
getContentPane().add(scrollPane);
txtUpMsg = new JTextPane();
txtUpMsg.setEditable(false);
scrollPane.setViewportView(txtUpMsg);
final JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(10, 273, 442, 98);
getContentPane().add(scrollPane_1);
txtDownMsg = new JTextPane();
scrollPane_1.setViewportView(txtDownMsg);
final JButton btnFont = new JButton();
btnFont.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
getSelectedFont();
}
});
btnFont.setText("字体");
btnFont.setBounds(209, 244, 73, 23);
getContentPane().add(btnFont);
final JButton btnColor = new JButton();
btnColor.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
getSelectedColor();
}
});
btnColor.setText("颜色");
btnColor.setBounds(298, 244, 81, 23);
getContentPane().add(btnColor);
final JButton btnClose = new JButton();
btnClose.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
send(new String(ClientConstants.LOGOUT+ClientConstants.LOGIN_SPLIT+tempMsgDTO.getUserId()));
dispose();
System.exit(0);
}
});
btnClose.setText("关闭(C)");
btnClose.setBounds(281, 382, 81, 23);
getContentPane().add(btnClose);
final JButton btnSend = new JButton();
btnSend.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
String content = txtDownMsg.getText();
if (content.trim().equals(""))//空消息
return;
if(cbxModel.getSelectedItem().toString().equals(tempMsgDTO.getUserId())){
javax.swing.JOptionPane.showMessageDialog(null, "对不起,您不能与自己交谈!");
return;
}
tempMsgDTO.setToWhere(cbxModel.getSelectedItem().toString());
tempMsgDTO.setContent(content);
//点击发送时把数据名发送到服务器
if(send(transferMsgDTO())){
txtDownMsg.setText("");
}
}
});
btnSend.setText("发送(S)");
btnSend.setBounds(368, 382, 84, 23);
getContentPane().add(btnSend);
final JLabel label = new JLabel();
label.setText("发给:");
label.setBounds(10, 240, 30, 27);
getContentPane().add(label);
cbxUserId = new JComboBox();
cbxUserId.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) { //这里控制为只处理一次
tempMsgDTO.setToWhere(cbxModel.getSelectedItem().toString());
}
}
});
cbxUserId.setBounds(46, 244, 142, 23);
getContentPane().add(cbxUserId);
// my methods
this.connect();
new Thread(this).start();
}
private void connect() {
try {
socket = new Socket(this.ip, this.port);
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
isConnected = true;
// ////////////////////////////////////////////////////////////////////
System.out.println("连接主机!-----success");
send(ClientConstants.LOGIN_REQUEST+ClientConstants.LOGIN_SPLIT+this.tempMsgDTO.getUserId());
} catch (IOException e) {
e.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(null, "登陆失败,服务器不存在或端口错误!");
System.exit(0);
}
}
private boolean send(Object obj){
try {
this.oos.writeObject(obj);
this.oos.flush();
return true;
} catch (IOException e) {
javax.swing.JOptionPane.showMessageDialog(null, "信息发送失败,服务器可能已经关闭!");
e.printStackTrace();
return false;
}
}
private boolean cbxContains(String item){
int count=this.cbxModel.getSize();
for(int i=0;i<count;i++){
if(this.cbxModel.getElementAt(i).equals(item)){
return true;
}
}
return false;
}
@SuppressWarnings("unchecked")
public void run() {
try {
while (isConnected) {
Object tempObj = ois.readObject();
//如果收到的是一个字符串
if(tempObj instanceof String){
if(tempObj.equals(ClientConstants.LOGIN_REPEAT)){
dispose();
javax.swing.JOptionPane.showMessageDialog(null, "登陆失败,该用户已经在其它地方登陆!");
ClientMainClass.main(new String[0]);
}
if(tempObj.equals(ClientConstants.LOGIN_SUCCESS)){
TxtManager.saveUserId(this.tempMsgDTO.getUserId());
}
}
//如果接收到的是一个集合
if(tempObj instanceof java.util.List){
String selectedItem=null;
if(this.cbxModel.getSize()>0){
selectedItem=this.cbxModel.getSelectedItem().toString();
}
this.cbxModel.removeAllElements();
List<String> list=(List<String>)tempObj;
list.add(0,ClientConstants.FIRST_ITEM);
for(String userId:list){
cbxModel.addElement(userId);
}
cbxUserId.setModel(cbxModel);
//判断刷新前的选项在当前cbx列表中是否存在
if(selectedItem!=null && cbxContains(selectedItem)){
cbxUserId.setSelectedIndex(cbxModel.getIndexOf(selectedItem));
}
}
//如果接收到的是数据包
if (tempObj instanceof MsgDTO1) {
MsgDTO1 tempMsgDTO = (MsgDTO1) tempObj;
setMessageText(tempMsgDTO);
}
}
} catch (Exception e) {
System.out.println("出错:ClientFrame.run");
e.printStackTrace();
}
}
private void getSelectedFont() {
FontDialog dialog = new FontDialog(this, "请选择一种字体", this.tempMsgDTO
.getFont(), true);
dialog.showDialog();
Font tempFont = null;
if (FontDialog.DialogResult.Ok == dialog.getDialogResult()) {
tempFont = dialog.getSelectedFont();
}
dialog.Dispose();
if (tempFont != null) {
this.tempMsgDTO.setFont(tempFont);
}
}
private void getSelectedColor() {
Color color = JColorChooser.showDialog(this, "请选择一种颜色", this.tempMsgDTO
.getColor());
if (color != null) {
this.tempMsgDTO.setColor(color);
}
}
private MsgDTO1 transferMsgDTO(){
MsgDTO1 msgDTO=new MsgDTO1();
msgDTO.setUserId(this.tempMsgDTO.getUserId());
msgDTO.setContent(this.tempMsgDTO.getContent());
msgDTO.setToWhere(this.tempMsgDTO.getToWhere());
msgDTO.setFont(this.tempMsgDTO.getFont());
msgDTO.setColor(this.tempMsgDTO.getColor());
return msgDTO;
}
private void setMessageText(MsgDTO1 tempMsgDTO) {
String msg=tempMsgDTO.getUserId()
+ " 对 "
+ tempMsgDTO.getToWhere() + " 说: "
+ tempMsgDTO.getContent() + '\n';
try {
addStylesToDocument(tempMsgDTO);
doc.insertString(doc.getLength(),msg, doc.getStyle("style1"));
} catch (BadLocationException e) {
e.printStackTrace();
}
// 让文本框的焦点始终在最下面
txtUpMsg.setCaretPosition(doc.getLength());
}// 初始化10种颜色的字体
private void addStylesToDocument(MsgDTO1 tempMsgDTO) {
doc = txtUpMsg.getStyledDocument();
StyledDocument doc = txtUpMsg.getStyledDocument();
// 试试简单方法
Style def = StyleContext.getDefaultStyleContext().getStyle(
StyleContext.DEFAULT_STYLE);
Font tempFont=tempMsgDTO.getFont();
Style tempStyle=doc.addStyle("style1", def);
StyleConstants.setBold(tempStyle,tempFont.isBold());
StyleConstants.setFontSize(tempStyle, tempFont.getSize());
StyleConstants.setItalic(tempStyle,tempFont.isItalic());
StyleConstants.setForeground(tempStyle,tempMsgDTO.getColor());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -