📄 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.JDesktopPane;
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.JToolBar;
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.MsgDTO;
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 InputStream in;
// private OutputStream out;
private ObjectInputStream ois;
private ObjectOutputStream oos;
private boolean isConnected = false;
private JTextPane txtDownMsg;
private JTextPane txtUpMsg;
private MsgDTO tempMsgDTO=new MsgDTO();
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 = new JMenu();
menu.setText("文件(F)");
menuBar.add(menu);
final JMenuItem menuItem = new JMenuItem();
menuItem.setText("Menu Item");
menu.add(menuItem);
final JMenu menu_1 = new JMenu();
menu_1.setText("编辑(E)");
menuBar.add(menu_1);
final JMenuItem menuItem_1 = new JMenuItem();
menuItem_1.setText("Menu Item");
menu_1.add(menuItem_1);
final JMenu menu_2 = new JMenu();
menu_2.setText("动作(V)");
menuBar.add(menu_2);
final JMenuItem menuItem_2 = new JMenuItem();
menuItem_2.setText("Menu Item");
menu_2.add(menuItem_2);
final JMenu menu_3 = new JMenu();
menu_3.setText("设置(T)");
menuBar.add(menu_3);
final JMenuItem menuItem_3 = new JMenuItem();
menuItem_3.setText("Menu Item");
menu_3.add(menuItem_3);
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 JDesktopPane desktopPane = new JDesktopPane();
desktopPane.setBounds(0, 0, 512, 27);
getContentPane().add(desktopPane);
final JToolBar toolBar = new JToolBar();
toolBar.setBounds(0, 0, 512, 27);
desktopPane.add(toolBar);
final JButton button = new JButton();
button.setText("语音视频");
toolBar.add(button);
toolBar.addSeparator();
final JButton button_1 = new JButton();
button_1.setText("发送文件");
toolBar.add(button_1);
toolBar.addSeparator();
final JButton button_2 = new JButton();
toolBar.add(button_2);
button_2.setText("短信");
toolBar.addSeparator();
final JButton button_3 = new JButton();
button_3.setText("邀请");
toolBar.add(button_3);
toolBar.addSeparator();
final JButton button_5 = new JButton();
button_5.setText("名片");
toolBar.add(button_5);
final JButton button_4 = new JButton();
button_4.setText("New JButton");
button_4.setBounds(283, 0, 99, 23);
desktopPane.add(button_4);
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 button_8 = new JButton();
button_8.setText("交谈记录(H)");
button_8.setBounds(10, 382, 109, 23);
getContentPane().add(button_8);
final JButton button_9 = new JButton();
button_9.setText("聊天模式(M)");
button_9.setBounds(125, 382, 109, 23);
getContentPane().add(button_9);
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());
// System.out.println("上线提示发送成功!");
} 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) {
// TODO Auto-generated catch block
// System.out.println("发送失败");
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){
// int selectedIndex=cbxUserId.getSelectedIndex();
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 MsgDTO) {
MsgDTO tempMsgDTO = (MsgDTO) 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();
// System.out.println("选择的字体是:"+tempFont.toString());
}
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 MsgDTO transferMsgDTO(){
MsgDTO msgDTO=new MsgDTO();
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(MsgDTO tempMsgDTO) {
String msg=tempMsgDTO.getUserId()
+ " 对 "
+ tempMsgDTO.getToWhere() + " 说: "
+ tempMsgDTO.getContent() + '\n';
// StyledDocument doc = txtMsg.getStyledDocument();
try {
addStylesToDocument(tempMsgDTO);
doc.insertString(doc.getLength(),msg, doc.getStyle("style1"));
} catch (BadLocationException e) {
e.printStackTrace();
}
// 让文本框的焦点始终在最下面
txtUpMsg.setCaretPosition(doc.getLength());
}// 初始化10种颜色的字体
private void addStylesToDocument(MsgDTO 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 + -