package client.frm; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Vector; import javax.imageio.ImageIO; import javax.swing.ButtonGroup; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.DefaultListSelectionModel; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.SwingConstants; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableRowSorter; import sun.audio.AudioPlayer; import sun.audio.AudioStream; import data.FriendUser; import data.JQMessage; import data.LoginUser; import data.Portrait; import data.Record; import data.UserState; /** * 主程序类、JQ的主框架类。<br> */ public class MainPane extends JFrame implements ActionListener { private JLabel lblPhoto = new JLabel(); private JComboBox boxState = new JComboBox(); private JLabel lblNickName = new JLabel(); private JTextArea txtSignature = new JTextArea(); private JList listFriend;// = new JList(); private DefaultListModel listModel = null; private JButton btnMenu = new JButton("菜单"); private JButton btnFind = new JButton("查找"); private JButton btnSys = new JButton("系统消息"); private JLabel lblLoginBar = new JLabel(); private JButton btnCancleLogin = new JButton("取消登录"); private JPanel fillWidth = new FillWidth(118, 120, Color.WHITE); private Socket client = null; private ObjectOutputStream oos = null; private ObjectInputStream ois = null; private HashMap<Integer, ChatPane> chat = null; private FriendUser selfUser = null; private String serverIp; private Integer serverPort; private Integer jqnum; private String password; private Integer state; private JPopupMenu popupMenu = null; private JMenuItem itemChat = null; private JMenuItem itemDelete = null; private JMenuItem itemFriendInfo = null; private JMenuItem itemLog = null; private FindWindow findWindow = null; private JPopupMenu menu = new JPopupMenu(); private JMenuItem itemQuit = new JMenuItem("退出"); private Broadcastwindow broadcastwindow = null; private Thread thread = null; /** * 登陆后显示的主面板的构造函数。 * * @param serverIp * 服务器ip。 * @param serverPort * 服务器端口。 * @param jqnum * 登陆的jq号码。 * @param password * 登陆的jq密码。 * @param state * 登陆的状态。 */ public MainPane(String serverIp, Integer serverPort, Integer jqnum, String password, Integer state) { this.serverIp = serverIp; this.serverPort = serverPort; this.jqnum = jqnum; this.password = password; this.state = state; // System.out.println(jqnum+":"+password+"State:"+state); setTitle("JQ2008"); setSize(200, 550); setResizable(false); Toolkit tk = Toolkit.getDefaultToolkit(); setLocation((tk.getScreenSize().width - getSize().width) - 10, (tk.getScreenSize().height - getSize().height) / 2 - 30); // init(); getContentPane().setBackground(Color.WHITE); initLoginPane(); // setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); thread = new LoginThread(); thread.start(); } /** * 初始化用户按下登陆按钮后,主面板显示登陆进度条窗体。 */ private void initLoginPane() { btnCancleLogin.setPreferredSize(new Dimension(60, 20)); btnCancleLogin.setMargin(new Insets(0, 0, 0, 0)); btnCancleLogin.setFocusPainted(false); lblLoginBar.setIcon(new ImageIcon(MainPane.class .getResource("/client/images/loginbar.gif"))); setLayout(new FlowLayout(FlowLayout.CENTER, 20, 10)); add(fillWidth); add(lblLoginBar); // add(new FillWidth(1,2,Color.WHITE)); add(btnCancleLogin); btnCancleLogin.addActionListener(this); // initMain(); } /** * 初始化用户登陆成功后,显示主窗体。 * * @param v * 好友列表。 */ private void initMain(Vector<FriendUser> v) { newMSG(25); selfUser = v.get(0); v.remove(0); setTitle("JQ2008 " + selfUser.getJqnum()); popupMenu = new JPopupMenu(); itemChat = new JMenuItem("发送即时消息"); itemDelete = new JMenuItem("删除该好友"); itemFriendInfo = new JMenuItem("查看好友资料"); itemLog = new JMenuItem("聊天记录"); popupMenu.add(itemChat); popupMenu.add(itemFriendInfo); popupMenu.addSeparator(); popupMenu.add(itemLog); popupMenu.addSeparator(); popupMenu.add(itemDelete); menu.add(new JMenuItem("设置")); menu.addSeparator(); menu.add(new JMenuItem("帮助")); menu.addSeparator(); menu.add(itemQuit); itemQuit.addActionListener(this); btnMenu.addMouseListener(new ListMouseAdapter()); itemChat.addActionListener(this); itemDelete.addActionListener(this); itemFriendInfo.addActionListener(this); itemLog.addActionListener(this); btnMenu.setMargin(new Insets(0, 5, 0, 5)); btnFind.setMargin(new Insets(0, 5, 0, 5)); btnFind.addActionListener(this); btnSys.setMargin(new Insets(0, 5, 0, 5)); btnSys.addMouseListener(new ListMouseAdapter()); lblPhoto.setSize(50, 50); lblPhoto.setLocation(5, 5); lblPhoto.setOpaque(true); lblPhoto.setBackground(new Color(116, 220, 253, 150)); lblPhoto.setHorizontalAlignment(SwingConstants.CENTER); lblPhoto.setIcon(new Portrait(selfUser.getPhoto(), selfUser.getState())); lblPhoto.setBorder(new LineBorder(new Color(60, 168, 206), 1, true)); boxState.setSize(50, 20); boxState.setLocation(60, 5); boxState.addItem(UserState.ONLINESTATE); boxState.addItem(UserState.HIDDENSTATE); boxState.addItem(UserState.DEPARTURESTATE); boxState.addItem(UserState.BUSYSTATE); boxState.setSelectedIndex(selfUser.getState()); lblNickName.setSize(80, 20); lblNickName.setLocation(115, 5); lblNickName.setText(selfUser.getNickName() + "[" + UserState.getStateName(selfUser.getState()) + "]"); txtSignature.setText(selfUser.getSignature()); txtSignature.setEditable(false); txtSignature.setLineWrap(true); txtSignature.setBackground(getBackground()); JScrollPane spSign = new JScrollPane(txtSignature); spSign.setSize(125, 25); spSign.setLocation(60, 30); spSign.setBorder(new EmptyBorder(new Insets(0, 0, 0, 0))); JPanel paneTop = new JPanel(); paneTop.setLayout(null); paneTop.setPreferredSize(new Dimension(200, 60)); paneTop.add(lblPhoto); paneTop.add(boxState); paneTop.add(lblNickName); paneTop.add(spSign); listModel = new DefaultListModel(); for (FriendUser user : v) { listModel.addElement(user); } // System.out.println(v.size()); listFriend = new JList(); listFriend.setCellRenderer(new CompanyLogoListCellRenderer()); listFriend.setModel(listModel); listFriend.setFixedCellHeight(50); listFriend.addMouseListener(new ListMouseAdapter()); listFriend.addMouseMotionListener(new ListMouseAdapter()); JScrollPane sp = new JScrollPane(listFriend); chat = new HashMap<Integer, ChatPane>(); for (int i = 0; i < v.size(); i++) chat.put(v.get(i).getJqnum(), null); JPanel paneBottom = new JPanel(); paneBottom.setLayout(new FlowLayout(FlowLayout.LEADING, 5, 5)); paneBottom.add(btnMenu); paneBottom.add(btnSys); paneBottom.add(btnFind); setVisible(false); btnCancleLogin.removeActionListener(this); remove(fillWidth); remove(lblLoginBar); remove(btnCancleLogin); validate(); // repaint(); setLayout(new BorderLayout()); add(paneTop, BorderLayout.NORTH); add(sp, BorderLayout.CENTER); add(new FillWidth(5, 5), BorderLayout.EAST); add(new FillWidth(5, 5), BorderLayout.WEST); add(paneBottom, BorderLayout.SOUTH); setVisible(true); broadcastwindow = new Broadcastwindow(); } /** * 取消按钮、聊天按钮、删除好友、好友按钮、查找按钮事件。 */ public void actionPerformed(ActionEvent e) { if (e.getSource() == btnCancleLogin) { closeClient(); System.exit(0); return; } if (e.getSource() == itemChat) { chatWithFriend(); return; } if (e.getSource() == itemDelete) { JOptionPane.showMessageDialog(null, "功能制作中..."); return; } if (e.getSource() == itemFriendInfo) { JOptionPane.showMessageDialog(null, "功能制作中..."); return; } if (e.getSource() == itemLog) { JOptionPane.showMessageDialog(null, "功能制作中..."); return; } if (e.getSource() == btnFind) { if (findWindow == null) findWindow = new FindWindow(this, false); else { findWindow.setVisible(true); } return; } if (e.getSource() == itemQuit) { quit(); closeClient(); System.exit(0); } } /** * 根据好友号码获得listFriendUser中的好友。 * * @param jqnum * 好友的jq号码。 * @return 好友的信息FriendUser类。不存在是返回空。 */ private FriendUser getFriendUserFromList(int jqnum) { for (int i = 0; i < listFriend.getModel().getSize(); i++) { Object obj = listFriend.getModel().getElementAt(i); if (obj instanceof FriendUser) { FriendUser friendUser = (FriendUser) obj; if (friendUser.getJqnum() == jqnum) return friendUser; } } return null; } /** * 退出事件。 */ private void quit() { JQMessage message = new JQMessage(); message.setType(24); message.setObj(selfUser); try { oos.writeObject(message); oos.flush(); } catch (IOException e) { e.printStackTrace(); } closeClient(); thread.interrupt(); System.exit(0); } /* * public static void main(String[] args) { try { * //System.out.println(JQClient * .class.getResource("../tools/simsun.ttc").getPath()); Font font = * Font.createFont(Font.TRUETYPE_FONT, new * File(MainPane.class.getResource("/tools/simsun.ttc").getPath())); font = * font.deriveFont(Font.PLAIN, 12); SetFont.setFont(font); } catch * (FontFormatException e) { System.out.println("错误:"+e.getMessage()); } * catch (IOException e) { System.out.println("错误:"+e.getMessage()); } new * MainPane("",0,0,"",1); } */ /** * 窗体关闭时触发事件。 */ private class MyWindowAdapter extends WindowAdapter { public void windowClosing(WindowEvent e) { // super.windowClosing(e); quit(); } } /** * 自己定制的好友类表的 */ private class CompanyLogoListCellRenderer extends DefaultListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component retValue = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); // System.out.println(value.toString()); if (value instanceof FriendUser) { FriendUser user = (FriendUser) value; setIcon(new Portrait(user.getPhoto(), user.getState())); setToolTipText("<html>" + user.getNickName() + "[" + user.getJqnum() + "]" + "<br><font color='red'>" + user.getSignature() + "</font></html>"); } return retValue; } } /** * 鼠标事件,完成鼠标进入好友List中,选中好友,双击与好友进行聊天等。 */ private class ListMouseAdapter extends MouseAdapter { public void mouseMoved(MouseEvent e) { // System.out.println(e.getSource()); if (e.getSource() == listFriend) { listFriend.clearSelection(); int index = listFriend.locationToIndex(e.getPoint()); // System.out.println("index:"+index); listFriend.setSelectedIndex(index); } } public void mouseClicked(MouseEvent e) { if (e.getSource() == listFriend) { if (e.getClickCount() == 2) { chatWithFriend(); } if (e.getButton() == MouseEvent.BUTTON3) { popupMenu.show(listFriend, e.getX(), e.getY()); } return; } if (e.getSource() == btnMenu) { menu.show(btnMenu, e.getX() - 25, e.getY() - 75); } if (e.getSource() == btnSys) { broadcastwindow.showNow(); } } } /** * 打开好友聊天窗口。 */ private void chatWithFriend() { Object obj = listFriend.getSelectedValue(); if (obj instanceof FriendUser) { FriendUser friendUser = (FriendUser) obj; int jqnum = friendUser.getJqnum(); ChatPane chatPane = chat.get(jqnum); if (chatPane == null) { chatPane = new ChatPane(oos, friendUser, selfUser, true); chat.put(jqnum, chatPane); } else if (chatPane.isDisplayable()) { chatPane.setFocusable(true); chatPane.setState(NORMAL); } else { chatPane.setVisible(true); } } } /** * 登陆线程。处理服务端的信息以及发送消息到服务端。 */ private class LoginThread extends Thread { public LoginThread() { try { client = new Socket(serverIp, serverPort); MainPane.this.addWindowListener(new MyWindowAdapter()); oos = new ObjectOutputStream(new BufferedOutputStream( client.getOutputStream())); LoginUser loginUser = new LoginUser(); loginUser.setJqnum(jqnum); loginUser.setPassword(password); loginUser.setState(state); JQMessage message = new JQMessage(); message.setType(20); message.setObj(loginUser); new WriteThread(message).start(); ois = new ObjectInputStream(new BufferedInputStream( client.getInputStream())); // oos = new ObjectOutputStream(client.getOutputStream()); // ois = new ObjectInputStream(client.getInputStream()); } catch (UnknownHostException e) { closeClient(); JOptionPane.showMessageDialog(null, "请确保输入的服务器IP和端口正确!" + e.getMessage()); dispose(); new LoginPane(); } catch (IOException e) { closeClient(); JOptionPane.showMessageDialog(null, "请确保输入的服务器IP和端口正确!" + e.getMessage()); dispose(); new LoginPane(); } } public void run() { try { JQMessage message = null; while (ois != null) { Object obj = ois.readObject(); if (obj instanceof JQMessage) { message = (JQMessage) obj; int type = message.getType(); switch (type) { case 21:// 登陆成功 if (message.getObj() instanceof Vector) { Vector<FriendUser> v = (Vector) message .getObj(); initMain(v); } break; case 22:// 登录失败 closeClient(); JOptionPane.showMessageDialog(null, message .getObj().toString()); dispose(); new LoginPane(); break; case 23:// 账号在别处登录 causeLetClientQuit(message); break; case 25:// 好友上线 dealFriendUserLogin(message); break; case 31:// 接收到消息 dealRecord(message.getObj(), type); break; case 41:// 接受当前在线用户数 dealOnlineNum(message.getObj()); break; case 43:// 接受在线的用户显示到table上 dealShowOnlineUser(message.getObj()); break; case 45: JOptionPane.showMessageDialog(null, message .getObj().toString()); break; case 46: JOptionPane.showMessageDialog(null, message .getObj().toString()); break; case 90:// 服务端退出 causeLetClientQuit(message); break; case 91: dealBroadcast(message); break; } } } } catch (IOException e) { System.out.println("发生异常:" + e.getMessage()); closeClient(); JOptionPane.showMessageDialog(null, "和服务端连接发生错误:" + e.getMessage() + ",请重新登录!"); System.exit(0); } catch (ClassNotFoundException e) { System.out.println("发生异常:" + e.getMessage()); closeClient(); JOptionPane.showMessageDialog(null, "和服务端连接发生错误:" + e.getMessage() + ",请重新登录!"); System.exit(0); } } } /** * 处理广播。 * * @param message * JQMessage消息对象。 */ private void dealBroadcast(JQMessage message) { newMSG(message.getType()); if (broadcastwindow != null) { broadcastwindow.txt.setText(message.getObj().toString()); broadcastwindow.showNow(); } } /** * 有消息来时出发声音。 * * @param type * 消息的类型。 */ private void newMSG(int type) { // 播放*.au文件时建议使用下面的方法 // AudioClip audioClip = null; // if(n==31) // audioClip = // Applet.newAudioClip(MainPane.class.getResource("../sound/msg.au")); // if(n==91) // audioClip = // Applet.newAudioClip(MainPane.class.getResource("../sound/system.au")); // audioClip.play(); // 播放*.wav文件时建议使用下面的方法 try { AudioStream audioStream = null; switch (type) { case 25: audioStream = new AudioStream(getClass().getResourceAsStream( "/client/sound/global.wav")); break; case 31: audioStream = new AudioStream(getClass().getResourceAsStream( "/client/sound/msg.wav")); break; case 91: audioStream = new AudioStream(getClass().getResourceAsStream( "/client/sound/system.wav")); break; default: audioStream = new AudioStream(getClass().getResourceAsStream( "/client/sound/msg.wav")); break; } AudioPlayer.player.start(audioStream); } catch (IOException e) { System.out.println("在播放声音文件时[type=" + type + "],发生异常:" + e.getMessage()); } } /** * 处理好友上线时消息。 * * @param message */ private void dealFriendUserLogin(JQMessage message) { Object obj = message.getObj(); if (obj instanceof FriendUser) { newMSG(message.getType()); FriendUser friendUser = (FriendUser) obj; if (listModel.contains(friendUser)) { for (int i = 0; i < listModel.getSize(); i++) { Object object = listModel.get(i); if (object instanceof FriendUser) { FriendUser user = (FriendUser) object; if (user.equals(friendUser)) { user.setState(friendUser.getState()); user.setPhoto(friendUser.getPhoto()); user.setNickName(friendUser.getNickName()); user.setSignature(friendUser.getSignature()); listFriend.repaint(); break; } } } // 更改聊天窗口的图标 ChatPane chatPane = chat.get(friendUser.getJqnum()); if (chatPane != null) chatPane.updateFriendPhoto(new Portrait(friendUser .getPhoto(), friendUser.getState(), false)); } else { listModel.addElement(friendUser); chat.put(friendUser.getJqnum(), null); listFriend.repaint(); } } } /** * 根据服务端发送的消息,将在线用户显示到查找面板上。 * * @param obj * 在线用户。 */ private void dealShowOnlineUser(Object obj) { if (obj instanceof FriendUser) findWindow.addOnlineUser((FriendUser) obj); } /** * 显示在线用户数到查找面板上。 * * @param obj * 在线用户数。 */ private void dealOnlineNum(Object obj) { if (obj instanceof Integer) { int size = (Integer) obj; findWindow.lblOnlineNum.setText("当前在线人数 : " + size); } } /** * 处理服务端发送的从好友发过来的消息。 * * @param obj * Record对象。 * @param type * 消息类型。 */ private void dealRecord(Object obj, int type) { if (obj instanceof Record) { Record record = (Record) obj; FriendUser friendUser = getFriendUserFromList(record.getFromid()); if (friendUser != null) { newMSG(type); ChatPane chatPane = chat.get(record.getFromid()); if (chatPane == null) { chatPane = new ChatPane(oos, friendUser, selfUser, true); chat.put(friendUser.getJqnum(), chatPane); } else if (chatPane.isDisplayable()) { chatPane.setFocusable(true); chatPane.setState(NORMAL); } else { chatPane.setVisible(true); } chatPane.showRecord(friendUser.getNickName(), record, Color.BLUE); } } } /** * 因为某些原因服务端使得客户端退出。 * * @param message * 退出的JQMessage对象。 */ private void causeLetClientQuit(JQMessage message) { closeClient(); JOptionPane.showMessageDialog(null, message.getObj().toString()); System.exit(0); } /** * 书写消息线程。 */ private class WriteThread extends Thread { private JQMessage message = null; public WriteThread(JQMessage message) { this.message = message; } public void run() { try { if (oos != null) { oos.writeObject(message); oos.flush(); } } catch (IOException e) { System.out.println("发生异常:" + e.getMessage()); closeClient(); JOptionPane.showMessageDialog(null, "和服务端连接发生错误:" + e.getMessage() + ",请重新登录!"); System.exit(0); } } } /** * 关闭到服务端的连接。 */ private void closeClient() { try { if (oos != null) oos.close(); oos = null; if (ois != null) ois.close(); ois = null; if (client != null) client.close(); client = null; } catch (IOException e) { System.out.println("错误:" + e.getMessage()); } } /** * 查找好友窗口。 */ private class FindWindow extends JDialog implements ActionListener { private JTabbedPane paneFindWay = new JTabbedPane(); private JPanel paneBtn = new JPanel(); private JButton btnFind = new JButton("查找"); private JButton btnClose = new JButton("关闭"); private JButton btnPrevious = new JButton("上一步"); private JButton btnAddFriend = new JButton("加为好友"); private JPanel paneBaseFind = new JPanel(); private CardLayout card = new CardLayout(); private JPanel paneBaseFirst = new JPanel(); private JPanel paneBaseSecond = new JPanel(); private JLabel lblInfo = new JLabel("在此,您可以设置精确的查询条件来查找用户。"); private JRadioButton btnWhoIsOnline = new JRadioButton("看谁在线上"); private JRadioButton btnExactFind = new JRadioButton("精确查找"); private JLabel lblExactFind = new JLabel(); public JLabel lblOnlineNum = new JLabel("当前在线人数 : 未知"); private JLabel lblInfo2 = new JLabel("以下是JQ为您查找到的用户。"); public JTable tableUser = null; private DefaultTableModel model = new MyDefaultTableModel(); private Color bgColor = new Color(252, 254, 252); public FindWindow(Frame owner, boolean modal) { super(owner, modal); setTitle("JQ2008 查找/添加好友"); setSize(400, 325); setResizable(false); Toolkit tk = Toolkit.getDefaultToolkit(); setLocation((tk.getScreenSize().width - getSize().width) / 2, (tk.getScreenSize().height - getSize().height) / 2); try { setIconImage(ImageIO.read(getClass().getResource( "/client/images/searchbutton.gif"))); } catch (IOException e) { System.out.println("错误:" + e.getMessage()); } init(); setDefaultCloseOperation(DISPOSE_ON_CLOSE); setVisible(true); dealFindUser(40); model.setRowCount(0); } private void init() { paneBtn.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5)); paneBtn.add(btnFind); paneBtn.add(btnClose); lblInfo.setPreferredSize(new Dimension(350, 34)); lblInfo.setHorizontalAlignment(SwingConstants.LEFT); // lblInfo.setIcon(new // ImageIcon(getClass().getResource("../images/searchinfo.gif"))); lblInfo.setIcon(new ImageIcon(getClass().getResource( "/client/images/searchinfo.gif"))); ButtonGroup group = new ButtonGroup(); group.add(btnWhoIsOnline); group.add(btnExactFind); btnWhoIsOnline.setOpaque(true); btnWhoIsOnline.setSelected(true); btnWhoIsOnline.setBackground(bgColor); btnWhoIsOnline.setPreferredSize(new Dimension(218, 20)); btnExactFind.setOpaque(true); btnExactFind.setBackground(bgColor); btnExactFind.setPreferredSize(new Dimension(218, 20)); lblExactFind.setIcon(new ImageIcon(MainPane.class .getResource("/client/images/searchexact.gif"))); lblOnlineNum.setPreferredSize(new Dimension(338, 25)); paneBaseFirst.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 3)); paneBaseFirst.setOpaque(true); paneBaseFirst.setBackground(bgColor); paneBaseFirst.add(lblInfo); paneBaseFirst.add(btnWhoIsOnline); paneBaseFirst.add(btnExactFind); paneBaseFirst.add(lblExactFind); paneBaseFirst.add(lblOnlineNum); // paneBaseFirst.add(); lblInfo2.setIcon(new ImageIcon(getClass().getResource( "/client/images/searchinfo.gif"))); lblInfo2.setPreferredSize(new Dimension(360, 34)); lblInfo2.setOpaque(true); lblInfo2.setBackground(bgColor); String[] data = { "账号", "昵称", "个性签名" }; model.addColumn(data[0]); model.addColumn(data[1]); model.addColumn(data[2]); tableUser = new JTable(model); TableRowSorter sorter = new TableRowSorter(model); tableUser.setRowSorter(sorter); tableUser.setRowHeight(22); tableUser .setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION); tableUser .setPreferredScrollableViewportSize(new Dimension(360, 160)); TableColumn tcJQ = tableUser.getColumn(data[0]); tcJQ.setPreferredWidth(80); TableColumn tcNick = tableUser.getColumn(data[1]); tcNick.setPreferredWidth(90); TableColumn tcSign = tableUser.getColumn(data[2]); tcSign.setPreferredWidth(180); paneBaseSecond.setOpaque(true); paneBaseSecond.setBackground(new Color(252, 254, 252)); paneBaseSecond.add(lblInfo2); paneBaseSecond.add(new JScrollPane(tableUser)); paneBaseFind.setLayout(card); paneBaseFind.add("first", paneBaseFirst); paneBaseFind.add("second", paneBaseSecond); paneFindWay.add("基本查找", paneBaseFind); // add(new FillWidth(5,5),BorderLayout.NORTH); add(paneFindWay, BorderLayout.CENTER); add(new FillWidth(5, 5), BorderLayout.EAST); add(new FillWidth(5, 5), BorderLayout.WEST); add(paneBtn, BorderLayout.SOUTH); btnFind.addActionListener(this); btnClose.addActionListener(this); DefaultTableCellRenderer LblRenderer = new DefaultTableCellRenderer() { public void setValue(Object value) { if (value instanceof JLabel) { JLabel lbl = (JLabel) value; setIcon(lbl.getIcon()); setText(lbl.getText()); } else { super.setValue(value); } } }; LblRenderer.setHorizontalAlignment(SwingConstants.LEFT); tcJQ.setCellRenderer(LblRenderer); DefaultTableCellRenderer dtc1 = (DefaultTableCellRenderer) tableUser .getCellRenderer(0, 1); dtc1.setHorizontalAlignment(SwingConstants.CENTER); DefaultTableCellRenderer dtc2 = (DefaultTableCellRenderer) tableUser .getCellRenderer(0, 1); dtc2.setHorizontalAlignment(SwingConstants.CENTER); } private void dealFindUser(int type) { JQMessage message = new JQMessage(); message.setType(type); message.setObj(null); new WriteThread(message).start(); } public void actionPerformed(ActionEvent e) { if (e.getSource() == btnFind) { btnFind.removeActionListener(this); paneBtn.remove(btnFind); btnPrevious.addActionListener(this); btnAddFriend.addActionListener(this); paneBtn.add(btnPrevious, 0); paneBtn.add(btnAddFriend, 1); paneBtn.validate(); paneBtn.repaint(); card.next(paneBaseFind); if (btnWhoIsOnline.isSelected()) { dealFindUser(42); model.setRowCount(0); } } if (e.getSource() == btnClose) { dispose(); return; } if (e.getSource() == btnPrevious) { btnPrevious.removeActionListener(this); btnAddFriend.removeActionListener(this); paneBtn.remove(btnPrevious); paneBtn.remove(btnAddFriend); btnFind.addActionListener(this); paneBtn.add(btnFind, 0); paneBtn.validate(); paneBtn.repaint(); card.previous(paneBaseFind); dealFindUser(40); } if (e.getSource() == btnAddFriend) { int row = tableUser.getSelectedRow(); if (row == -1) { JOptionPane.showMessageDialog(null, "请选定一个用户!"); return; } Object value = tableUser.getValueAt(row, 0); if (value instanceof JLabel) { Integer jqnum = Integer .parseInt(((JLabel) value).getText()); JQMessage message = new JQMessage(); message.setType(44); message.setObj(jqnum); new WriteThread(message).start(); } System.out.println(value); } } private void addOnlineUser(FriendUser user) { if (isVisible()) { JLabel lblJQNum = new JLabel(user.getJqnum() + ""); lblJQNum.setIcon(new Portrait(user.getPhoto(), user.getState(), false)); Object[] data = { lblJQNum, user.getNickName(), user.getSignature() }; model.addRow(data); } } } private class MyDefaultTableModel extends DefaultTableModel { public boolean isCellEditable(int row, int column) { super.isCellEditable(row, column); return false; } /* * public Class getColumnClass(int c) { if(c==0) return JLabel.class; * else return super.getColumnClass(c); } */ } /** * 系统消息窗口。 */ private class Broadcastwindow extends JDialog implements WindowFocusListener { private JTextArea txt = new JTextArea("暂无系统消息!"); public Broadcastwindow() { super(); setTitle("系统消息"); setSize(200, 160); setResizable(false); setLocation(MainPane.this.getLocationOnScreen().x, MainPane.this.getLocationOnScreen().y + 357); JScrollPane sp = new JScrollPane(txt); txt.setEditable(false); txt.setLineWrap(true); sp.setSize(190, 125); sp.setLocation(5, 2); setLayout(null); add(sp); addWindowFocusListener(this); setDefaultCloseOperation(DISPOSE_ON_CLOSE); // setVisible(true); } public void windowGainedFocus(WindowEvent e) { } public void windowLostFocus(WindowEvent e) { dispose(); } public void showNow() { setLocation(MainPane.this.getLocationOnScreen().x, MainPane.this.getLocationOnScreen().y + 357); setVisible(true); } } }
最近下载更多
krispeng LV13
6月4日
陈小灏 LV15
2023年12月27日
xinxin23383 LV7
2023年11月28日
liugua777 LV2
2023年5月7日
微信网友_6444139264921600 LV6
2023年4月29日
xiexiaoming05 LV14
2022年5月21日
waitingforyou LV20
2022年3月31日
13112360 LV2
2021年12月5日
Aoifee LV4
2021年11月9日
18350164218 LV13
2021年6月18日