📄 chatpane.java
字号:
/**
* @(#)client.frm.ChatPane.java 2008-9-1
* Copy Right Information : Tarena
* Project : JavaQQ
* JDK version used : jdk1.6.4
* Comments : 聊天窗体类。
* Version : 1.0
* Sr Date Modified By Why & What is modified
* 1. 2008-9-1 小猪 新建
**/
package client.frm;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.io.File;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import javax.imageio.ImageIO;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextPane;
import javax.swing.JWindow;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import data.Face;
import data.FriendUser;
import data.JQMessage;
import data.Portrait;
import data.Record;
import tools.DateDeal;
/**
* 聊天窗体类。
* 2008-9-1
* @author 达内科技[Tarena Training Group]
* @version 1.0
* @since JDK1.6(建议)
*/
public class ChatPane extends JFrame implements ActionListener{
private JLabel lblTop = new JLabel();
private JLabel lblFriendInfo = new JLabel();
private JLabel lblPhoto = new JLabel();
private JTextPane txtMessage = new JTextPane();
private JTextPane txtWrite = new JTextPane();
private JPanel paneFriendInfo = new JPanel();
private JPanel paneTools = new JPanel();
private JPanel paneBtn = new JPanel();
private JButton btnSend = new JButton("发送(S)");
private JButton btnClose = new JButton("关闭(C)");
private JButton btnSet = new JButton("↓");
private JPopupMenu popupMenu = new JPopupMenu();
private JCheckBoxMenuItem itemEnter = new JCheckBoxMenuItem("按Enter发送");
private JCheckBoxMenuItem itemCEnter = new JCheckBoxMenuItem("按Ctrl+Enter发送");
private Color bgColor = new Color(169,213,244);
//private Socket client = null;
private ObjectOutputStream oos = null;
private FriendUser friendUser = null;
private FriendUser selfUser = null;
private JButton btnFaces = new JButton();
private FaceWindow faceWindow = null;
/**
* 窗体的构造函数。
* @param oos 输出对象流。
* @param friendUser FriendUser好友对象。
* @param selfUser FriendUser自己对象。
* @param show 是否显示。
*/
public ChatPane(ObjectOutputStream oos,FriendUser friendUser,FriendUser selfUser,boolean show) {
this.oos = oos;
this.friendUser = friendUser;
this.selfUser = selfUser;
setTitle("与 "+friendUser.getNickName()+" 交谈中");
setSize(494,500);
try {
setIconImage(ImageIO.read(ChatPane.class.getResource("/client/images/chat/icon.gif")));
} catch (IOException e) {
System.out.println("错误"+e.getMessage());
}
//setResizable(false);
Toolkit tk=Toolkit.getDefaultToolkit();
setLocation((tk.getScreenSize().width-getSize().width)/2,(tk.getScreenSize().height-getSize().height)/2);
init();
btnClose.addActionListener(this);
btnSend.addActionListener(this);
btnSet.addActionListener(this);
itemEnter.addActionListener(this);
itemCEnter.addActionListener(this);
btnFaces.addActionListener(this);
txtMessage.setContentType("text/html");
txtWrite.addKeyListener(new SendKeyListenter());
// txtWrite.setContentType("text/html");
// txtWrite.setText("<html><body style=\"font-size: 12px;font-family:'宋体';color:'red';font-style: normal;\" >测试数据</body></html>");
/* StyleContext sc = StyleContext.getDefaultStyleContext();
NamedStyle style = sc.new NamedStyle();
//Style style = new StyleContext.NamedStyle();
style.addAttribute("font-family", "宋体");
style.addAttribute("font-size", "12px");
style.addAttribute("font-style", "normal");
style.addAttribute("color", "yellow");
txtWrite.setLogicalStyle(style);
*/
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setVisible(show);
}
/**
* 初始化面板。
*/
private void init(){
lblTop.setPreferredSize(new Dimension(494,61));
lblTop.setVerticalAlignment(SwingConstants.TOP);
lblTop.setIcon(new ImageIcon(ChatPane.class.getResource("/client/images/chat/top.gif")));
lblTop.setOpaque(true);
lblTop.setBackground(bgColor);
lblFriendInfo.setVerticalAlignment(SwingConstants.TOP);
lblFriendInfo.setPreferredSize(new Dimension(151,407));
lblFriendInfo.setIcon(new ImageIcon(ChatPane.class.getResource("/client/images/chat/friend_info.gif")));
lblFriendInfo.setOpaque(true);
lblFriendInfo.setBackground(bgColor);
btnClose.setFocusPainted(false);
btnClose.setPreferredSize(new Dimension(60,20));
btnClose.setMargin(new Insets(0,5,0,5));
btnSend.setFocusPainted(false);
btnSend.setPreferredSize(new Dimension(60,20));
btnSend.setMargin(new Insets(0,5,0,5));
btnSet.setFocusPainted(false);
btnSet.setPreferredSize(new Dimension(9,20));
btnSet.setMargin(new Insets(0,-4,0,-5));
btnFaces.setIcon(new Face(200));
btnFaces.setMargin(new Insets(0,0,0,0));
btnFaces.setBorder(new EmptyBorder(0,0,0,0));
lblPhoto.setPreferredSize(new Dimension(20,20));
lblPhoto.setIcon(new Portrait(friendUser.getPhoto(),friendUser.getState(),false));
JLabel lblInfo = new JLabel(friendUser.getNickName()+"("+friendUser.getJqnum()+") "+friendUser.getSignature());
lblInfo.setPreferredSize(new Dimension(290,20));
lblInfo.setForeground(Color.BLUE);
//lblInfo.setBorder(new LineBorder(Color.BLACK));
paneFriendInfo.setOpaque(true);
paneFriendInfo.setBackground(new Color(205,237,255));
paneFriendInfo.setPreferredSize(new Dimension(337,25));
paneFriendInfo.setLayout(new FlowLayout(FlowLayout.LEFT,5,2));
paneFriendInfo.add(lblPhoto);
paneFriendInfo.add(lblInfo);
paneTools.setOpaque(true);
paneTools.setBackground(new Color(205,237,255));
paneTools.setPreferredSize(new Dimension(337,25));
paneTools.setLayout(new FlowLayout(FlowLayout.LEFT,2,5));
paneTools.add(btnFaces);
paneBtn.setPreferredSize(new Dimension(337,30));
paneBtn.setOpaque(true);
paneBtn.setBackground(bgColor);
paneBtn.setLayout(new FlowLayout(FlowLayout.RIGHT,0,5));
paneBtn.add(btnClose);
paneBtn.add(new FillWidth(5,20,bgColor));
paneBtn.add(btnSend);
paneBtn.add(new FillWidth(5,20,bgColor));
paneBtn.add(btnSet);
JScrollPane spMessage = new JScrollPane(txtMessage);
spMessage.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
spMessage.setBorder(new EmptyBorder(0,0,0,0));
JScrollPane spWrite = new JScrollPane(txtWrite);
spWrite.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
spWrite.setBorder(new EmptyBorder(0,0,0,0));
JPanel paneMessage = new JPanel();
paneMessage.setLayout(new BorderLayout());
paneMessage.add(paneFriendInfo,BorderLayout.NORTH);
paneMessage.add(spMessage,BorderLayout.CENTER);
JPanel paneWrite = new JPanel();
paneWrite.setPreferredSize(new Dimension(337,96));
paneWrite.setLayout(new BorderLayout());
paneWrite.add(paneTools,BorderLayout.NORTH);
paneWrite.add(spWrite,BorderLayout.CENTER);
paneWrite.add(paneBtn,BorderLayout.SOUTH);
JPanel paneCenter = new JPanel();
paneCenter.setLayout(new BorderLayout());
paneCenter.setBorder(new LineBorder(new Color(118,171,211)));
paneCenter.setOpaque(true);
paneCenter.setBackground(bgColor);
paneCenter.add(paneMessage,BorderLayout.CENTER);
paneCenter.add(paneWrite,BorderLayout.SOUTH);
JPanel paneAll = new JPanel();
paneAll.setLayout(new BorderLayout());
paneAll.setOpaque(true);
paneAll.setBackground(bgColor);
paneAll.add(paneCenter,BorderLayout.CENTER);
paneAll.add(paneBtn,BorderLayout.SOUTH);
setLayout(new BorderLayout());
add(lblTop,BorderLayout.NORTH);
add(new FillWidth(6,407,bgColor),BorderLayout.WEST);
add(lblFriendInfo,BorderLayout.EAST);
add(paneAll,BorderLayout.CENTER);
add(new FillWidth(494,5,bgColor),BorderLayout.SOUTH);
ButtonGroup btnGroup = new ButtonGroup();
btnGroup.add(itemCEnter);
btnGroup.add(itemEnter);
popupMenu.add(itemEnter);
popupMenu.add(itemCEnter);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -