`
DemoGilbete
  • 浏览: 5759 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

QQ聊天系统

阅读更多

    import java.awt.BorderLayout; 
    import java.awt.Component; 
    import java.awt.Dialog; 
    import java.awt.Dimension; 
    import java.awt.FlowLayout; 
    import java.awt.GridBagConstraints; 
    import java.awt.GridBagLayout; 
    import java.awt.GridLayout; 
    import java.awt.Image; 
    import java.awt.Insets; 
    import java.awt.MenuItem; 
    import java.awt.PopupMenu; 
    import java.awt.Rectangle; 
    import java.awt.SystemTray; 
    import java.awt.Toolkit; 
    import java.awt.TrayIcon; 
    import java.awt.TrayIcon.MessageType; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.awt.event.ComponentAdapter; 
    import java.awt.event.ComponentEvent; 
    import java.awt.event.MouseAdapter; 
    import java.awt.event.MouseEvent; 
    import java.awt.event.WindowAdapter; 
    import java.awt.event.WindowEvent; 
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileNotFoundException; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.net.DatagramPacket; 
    import java.net.DatagramSocket; 
    import java.net.InetAddress; 
    import java.net.SocketException; 
    import java.net.UnknownHostException; 
    import java.util.Date; 
    import java.util.Scanner; 
    import java.util.Stack; 
    import java.util.prefs.Preferences; 
     
    import javax.swing.BoxLayout; 
    import javax.swing.ImageIcon; 
    import javax.swing.JButton; 
    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.JPasswordField; 
    import javax.swing.JPopupMenu; 
    import javax.swing.JProgressBar; 
    import javax.swing.JScrollPane; 
    import javax.swing.JTabbedPane; 
    import javax.swing.JTextField; 
    import javax.swing.JToggleButton; 
    import javax.swing.ScrollPaneConstants; 
    import javax.swing.SwingConstants; 
    import javax.swing.UIManager; 
    import javax.swing.border.BevelBorder; 
    import javax.swing.border.Border; 
    import javax.swing.border.EmptyBorder; 
    import javax.swing.border.TitledBorder; 
    import javax.swing.tree.DefaultMutableTreeNode; 
    import javax.swing.tree.DefaultTreeModel; 
    import javax.swing.tree.TreePath; 
     
     
    public class EQ extends JDialog{ 
        private JTextField ipEndTField; 
        private JTextField ipStartTField; 
        private JTextField userNameTField;//用户框  
        private JPasswordField passwordTField;//密码框  
        private JTextField placardPathTField;//placard:公告  
        private JTextField updatePathTField;//更新路径  
        private JTextField pubPathTField; 
        public static EQ frame = null; 
        private ChatTree chatTree; 
        private JPopupMenu popupMenu;//右键菜单  
        private JTabbedPane tabbedPane;//分页面板  
        private JToggleButton searchUserButton;//搜索用户按钮  
        private JProgressBar progressBar;//滚动条  
        private JList faceList; 
        private JButton selectInterfaceOKButton; 
        private DatagramSocket ss;//数据报插座  
        private final JLabel stateLabel; 
        private static String user_dir; 
        private static File localFile; 
        private static File netFile; 
        private String netFilePath; 
        private JButton messageAlertButton; 
        private Stack<String> messageStack;////Stack 类表示后进先出(LIFO)的对象堆栈。  
        private ImageIcon messageAlertIcon; 
        private ImageIcon messageAlertNullIcon; 
        private Rectangle location; 
        public static TrayIcon trayicon; 
        private Dao dao; 
        //Preferences.systeRoot:返回系统的根首选项节点   Preferences:参数选择  
        public final static Preferences preferences = Preferences.systemRoot(); 
        private JButton userInfoButton; 
        //----------------------------------------------------------------------------------  
        public static void main(String[] args){ 
            try{ 
                String laf = preferences.get("lookAndFeel", "java默认"); 
                if(laf.indexOf("当前系统") > -1){ 
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
                } 
                EQ frame = new EQ(); 
                frame.setVisible(true); 
                frame.SystemTrayInitial();// 初始化系统栏  
                frame.server(); 
                frame.checkPlacard(); 
            }catch(Exception e){ 
                e.printStackTrace(); 
            } 
        } 
        //----------------------------------------------------------------------------------  
        public EQ(){ 
            super(new JFrame()); 
            frame = this; 
            dao = Dao.getDao(); 
            location = dao.getLocation(); 
            setTitle("EQ聊天"); 
            setBounds(location); 
            progressBar = new JProgressBar(); 
            //BevelBorder:该类实现简单的双线斜面边框。Bevel:斜面     lowered:凹入斜面类型。  
            progressBar.setBorder(new BevelBorder(BevelBorder.LOWERED)); 
            tabbedPane = new JTabbedPane(); 
            popupMenu = new JPopupMenu(); 
            chatTree = new ChatTree(this); 
            user_dir = System.getProperty("user.dir");// 程序执行路径用于系统更新  
            localFile = new File(user_dir + File.separator + "EQ.jar");// 本地EQ文件  
            stateLabel = new JLabel();// 状态栏标签  
            this.addWindowListener(new FrameWindowListener());// 添加窗体监视器  
            this.addComponentListener(new ComponentAdapter(){ 
                public void componentResized(final ComponentEvent e){ 
                    saveLocation(); 
                } 
                public void componentMoved(final ComponentEvent e){ 
                    saveLocation(); 
                } 
            }); 
            try{// 启动通讯服务端口  
                ss = new DatagramSocket(1111); 
            }catch(SocketException e2){ 
                if(e2.getMessage().startsWith("Address already in use")){ 
                    showMessageDialog("服务端口被占用,或者本软件已经运行。"); 
                } 
                System.exit(0); 
            } 
            {// 初始化公共信息按钮  
                messageAlertIcon = new ImageIcon(EQ.class.getResource("/image/messageAlert.gif")); 
                messageAlertNullIcon = new ImageIcon(EQ.class.getResource("/image/messageAlertNull20.gif")); 
                messageStack = new Stack<String>(); 
                messageAlertButton = new JButton(); 
                messageAlertButton.setHorizontalAlignment(SwingConstants.RIGHT); 
                messageAlertButton.setContentAreaFilled(false);//不填充内容区域  
                final JPanel BannerPanel = new JPanel(); 
                BannerPanel.setLayout(new BorderLayout()); 
                this.add(BannerPanel,BorderLayout.NORTH); 
                userInfoButton = new JButton(); 
                BannerPanel.add(userInfoButton,BorderLayout.WEST); 
                userInfoButton.setMargin(new Insets(0,0,0,10));//Margin:边距    insets:插入   
                initUserInfoButton();// 初始化本地用户头像按钮  
                BannerPanel.add(messageAlertButton,BorderLayout.CENTER); 
                messageAlertButton.addActionListener(new ActionListener(){ 
     
                    @Override 
                    public void actionPerformed(ActionEvent arg0) { 
                        if(!messageStack.empty()){ 
                            showMessageDialog(messageStack.pop());//堆栈顶部的对象(Vector 对象中的最后一项)。   
                        } 
                    } 
                }); 
                messageAlertButton.setIcon(messageAlertIcon); 
                showMessageBar(); 
            } 
            this.add(tabbedPane,BorderLayout.CENTER); 
            tabbedPane.setTabPlacement(SwingConstants.LEFT);//设置此选项卡窗格的选项卡布局  
            ImageIcon userTicon = new ImageIcon(EQ.class.getResource("/image/tabIcon/tabLeft.PNG")); 
            tabbedPane.addTab(null,userTicon,createUserList(),"用户列表"); 
            ImageIcon sysOTicon = new ImageIcon(EQ.class.getResource("/image/tabIcon/tabLeft2.PNG")); 
            tabbedPane.addTab(null, sysOTicon, createSysToolPanel(), "系统操作"); 
            ImageIcon sysSTicon = new ImageIcon(EQ.class.getResource("/image/tabIcon/tabLeft3.png")); 
            tabbedPane.addTab(null, sysSTicon, createSysSetPanel(), "系统设置"); 
            this.setAlwaysOnTop(true);//总在顶部  
        } 
        //----------------------------------------------------------------------------------  
        private JScrollPane createSysSetPanel(){//系统设置面板  
            final JPanel sysSetPanel = new JPanel(); 
            JScrollPane scrollPane = new JScrollPane(sysSetPanel); 
            sysSetPanel.setLayout(new BoxLayout(sysSetPanel,BoxLayout.Y_AXIS)); 
            scrollPane.setBorder(new EmptyBorder(0,0,0,0)); 
            final JPanel sysPathPanel = new JPanel(); 
            sysPathPanel.setMaximumSize(new Dimension(600,200)); 
            sysPathPanel.setBorder(new TitledBorder("系统路径"));//title - 边框应显示的标题  
            sysPathPanel.setLayout(new GridLayout(0,1)); 
            sysSetPanel.add(sysPathPanel); 
            sysPathPanel.add(new JLabel("程序升级路径")); 
            updatePathTField = new JTextField(preferences.get("updatePath", "请输入路径")); 
            sysPathPanel.add(updatePathTField); 
            sysPathPanel.add(new JLabel("系统公告路径:")); 
            placardPathTField = new JTextField(preferences.get("placardPath","请输入路径")); 
            sysPathPanel.add(placardPathTField); 
            sysPathPanel.add(new JLabel("公共程序路径:")); 
            pubPathTField = new JTextField(preferences.get("pubPath", "请输入路径")); 
            sysPathPanel.add(pubPathTField); 
            final JButton pathOKButton = new JButton("确定"); 
            pathOKButton.setActionCommand("sysOK"); 
            pathOKButton.addActionListener(new SysSetPanelOKListener()); 
            sysSetPanel.add(pathOKButton); 
            final JPanel loginPanel = new JPanel(); 
            loginPanel.setMaximumSize(new Dimension(600, 90)); 
            loginPanel.setBorder(new TitledBorder("登录升级服务器")); 
            final GridLayout gridLayout_1 = new GridLayout(0, 1); 
            gridLayout_1.setVgap(5); 
            loginPanel.setLayout(gridLayout_1); 
            sysSetPanel.add(loginPanel); 
            final JPanel panel_7 = new JPanel(); 
            panel_7.setLayout(new BoxLayout(panel_7, BoxLayout.X_AXIS)); 
            loginPanel.add(panel_7); 
            panel_7.add(new JLabel("用户名:")); 
            userNameTField = new JTextField(preferences.get("username", "请输入用户名")); 
            panel_7.add(userNameTField); 
            final JPanel panel_8 = new JPanel(); 
            panel_8.setLayout(new BoxLayout(panel_8, BoxLayout.X_AXIS)); 
            loginPanel.add(panel_8); 
            panel_8.add(new JLabel("密 码:")); 
            passwordTField = new JPasswordField("*****"); 
            panel_8.add(passwordTField); 
            final JButton loginOKButton = new JButton("确定"); 
            sysSetPanel.add(loginOKButton); 
            loginOKButton.setActionCommand("loginOK"); 
            loginOKButton.addActionListener(new SysSetPanelOKListener()); 
            final JPanel ipPanel = new JPanel(); 
            final GridLayout gridLayout_2 = new GridLayout(0, 1); 
            gridLayout_2.setVgap(5); 
            ipPanel.setLayout(gridLayout_2); 
            ipPanel.setMaximumSize(new Dimension(600, 90)); 
            ipPanel.setBorder(new TitledBorder("IP搜索范围")); 
            sysSetPanel.add(ipPanel); 
            final JPanel panel_5 = new JPanel(); 
            panel_5.setLayout(new BoxLayout(panel_5, BoxLayout.X_AXIS)); 
            ipPanel.add(panel_5); 
            panel_5.add(new JLabel("起始IP:")); 
            ipStartTField = new JTextField(preferences.get("ipStart", "192.168.0.1")); 
            panel_5.add(ipStartTField); 
            final JPanel panel_6 = new JPanel(); 
            panel_6.setLayout(new BoxLayout(panel_6, BoxLayout.X_AXIS)); 
            ipPanel.add(panel_6); 
            panel_6.add(new JLabel("终止IP:")); 
            ipEndTField = new JTextField(preferences.get("ipEnd", "192.168.1.255")); 
            panel_6.add(ipEndTField); 
            final JButton ipOKButton = new JButton("确定"); 
            ipOKButton.setActionCommand("ipOK"); 
            ipOKButton.addActionListener(new SysSetPanelOKListener()); 
            sysSetPanel.add(ipOKButton); 
            return scrollPane; 
        } 
        //----------------------------------------------------------------------------------  
        private JScrollPane createUserList(){// 用户列表面板  
            JScrollPane scrollPane = new JScrollPane(); 
            scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
            addUserPopup(chatTree,getPopupMenu());// 为用户添加弹出菜单  
            scrollPane.setViewportView(chatTree); 
            scrollPane.setBorder(new EmptyBorder(0,0,0,0)); 
            chatTree.addMouseListener(new ChatTreeMouseListener()); 
             
            return scrollPane; 
        } 
        //----------------------------------------------------------------------------------  
        private JScrollPane createSysToolPanel() {// 系统工具面板  
            JPanel sysToolPanel = new JPanel(); // 系统工具面板  
            sysToolPanel.setLayout(new BorderLayout()); 
            JScrollPane sysToolScrollPanel = new JScrollPane(); 
            sysToolScrollPanel 
                    .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
            sysToolScrollPanel.setBorder(new EmptyBorder(0, 0, 0, 0)); 
            sysToolScrollPanel.setViewportView(sysToolPanel); 
            sysToolPanel.setBorder(new BevelBorder(BevelBorder.LOWERED)); 
            JPanel interfacePanel = new JPanel(); 
            sysToolPanel.add(interfacePanel, BorderLayout.NORTH); 
            interfacePanel.setLayout(new BorderLayout()); 
            interfacePanel.setBorder(new TitledBorder("界面选择-再次启动生效")); 
            faceList = new JList(new String[]{"当前系统", "java默认"}); 
            interfacePanel.add(faceList); 
            faceList.setBorder(new BevelBorder(BevelBorder.LOWERED)); 
            final JPanel interfaceSubPanel = new JPanel(); 
            interfaceSubPanel.setLayout(new FlowLayout()); 
            interfacePanel.add(interfaceSubPanel, BorderLayout.SOUTH); 
            selectInterfaceOKButton = new JButton("确定"); 
            selectInterfaceOKButton.addActionListener(new ActionListener() { 
                public void actionPerformed(ActionEvent e) { 
                    preferences.put("lookAndFeel", faceList.getSelectedValue().toString()); 
                    JOptionPane.showMessageDialog(EQ.this, "重新运行本软件后生效"); 
                } 
            }); 
            interfaceSubPanel.add(selectInterfaceOKButton); 
     
            JPanel searchUserPanel = new JPanel(); // 用户搜索面板  
            sysToolPanel.add(searchUserPanel); 
            searchUserPanel.setLayout(new BorderLayout()); 
            final JPanel searchControlPanel = new JPanel(); 
            searchControlPanel.setLayout(new GridLayout(0, 1)); 
            searchUserPanel.add(searchControlPanel, BorderLayout.SOUTH); 
            final JList searchUserList = new JList(new String[]{"检测用户列表"});// 新添加用户列表  
            final JScrollPane scrollPane_2 = new JScrollPane(searchUserList); 
            scrollPane_2.setDoubleBuffered(true); 
            searchUserPanel.add(scrollPane_2); 
            searchUserList.setBorder(new BevelBorder(BevelBorder.LOWERED)); 
            searchUserButton = new JToggleButton(); 
            searchUserButton.setText("搜索新用户"); 
            searchUserButton.addActionListener(new SearchUserActionListener(searchUserList)); 
            searchControlPanel.add(progressBar); 
            searchControlPanel.add(searchUserButton); 
            searchUserPanel.setBorder(new TitledBorder("搜索用户")); 
     
            final JPanel sysUpdatePanel = new JPanel(); 
            sysUpdatePanel.setOpaque(false); 
            sysUpdatePanel.setLayout(new GridBagLayout()); 
            sysUpdatePanel.setBorder(new TitledBorder("系统操作")); 
            sysToolPanel.add(sysUpdatePanel, BorderLayout.SOUTH); 
            final JButton sysUpdateButton = new JButton("系统更新"); 
            final GridBagConstraints gridBagConstraints_1 = new GridBagConstraints(); 
            gridBagConstraints_1.gridx = 0; 
            gridBagConstraints_1.gridy = 0; 
            sysUpdatePanel.add(sysUpdateButton, gridBagConstraints_1); 
            sysUpdateButton.addActionListener(new SysUpdateListener());// 添加系统更新事件  
            final JLabel updateLabel = new JLabel("最近更新:"); 
            final GridBagConstraints updateLabelLayout = new GridBagConstraints(); 
            updateLabelLayout.gridy = 1; 
            updateLabelLayout.gridx = 0; 
            sysUpdatePanel.add(updateLabel, updateLabelLayout); 
            final JLabel updateDateLabel = new JLabel();// 程序更新日期标签  
            Date date = new Date(localFile.lastModified()); 
            String dateStr = String.format("%tF %<tr", date); 
            updateDateLabel.setText(dateStr); 
            final GridBagConstraints updateDateLayout = new GridBagConstraints(); 
            updateDateLayout.gridy = 2; 
            updateDateLayout.gridx = 0; 
            sysUpdatePanel.add(updateDateLabel, updateDateLayout); 
            final JLabel updateStaticLabel = new JLabel("更新状态:"); 
            final GridBagConstraints updateStaticLayout = new GridBagConstraints(); 
            updateStaticLayout.gridy = 3; 
            updateStaticLayout.gridx = 0; 
            sysUpdatePanel.add(updateStaticLabel, updateStaticLayout); 
            final JLabel updateInfoLabel = new JLabel();// 版本信息标签  
            checkSysInfo(updateInfoLabel);// 调用检测版本更新的方法  
            final GridBagConstraints gridBagConstraints_5 = new GridBagConstraints(); 
            gridBagConstraints_5.gridy = 4; 
            gridBagConstraints_5.gridx = 0; 
            sysUpdatePanel.add(updateInfoLabel, gridBagConstraints_5); 
            JPanel statePanel = new JPanel(); 
            add(statePanel, BorderLayout.SOUTH); 
            statePanel.setLayout(new BorderLayout()); 
            statePanel.add(stateLabel); 
            stateLabel.setText("总人数:" + chatTree.getRowCount()); 
            return sysToolScrollPanel; 
        } 
        //----------------------------------------------------------------------------------  
        private void initUserInfoButton(){ 
            try{ 
                String ip = InetAddress.getLocalHost().getHostAddress(); 
                User user = dao.getUser(ip); 
                userInfoButton.setIcon(user.getIconImg()); 
                userInfoButton.setText(user.getName()); 
                userInfoButton.setIconTextGap(JLabel.RIGHT); 
                userInfoButton.setToolTipText(user.getTipText()); 
                userInfoButton.getParent().doLayout(); 
            }catch(UnknownHostException e1){ 
                e1.printStackTrace(); 
            } 
        } 
        //----------------------------------------------------------------------------------  
        private void showMessageBar(){// 显示公告信息按钮的线程  
            new Thread(new Runnable() { 
                public void run() { 
                    while (true) { 
                        if (!messageStack.empty()) { 
                            try { 
                                messageAlertButton.setIcon(messageAlertNullIcon); 
                                messageAlertButton.setPreferredSize(new Dimension(20, 20)); 
                                Thread.sleep(500); 
                                messageAlertButton.setIcon(messageAlertIcon); 
                                Thread.sleep(500); 
                            } catch (InterruptedException e) { 
                                e.printStackTrace(); 
                            } 
                        } else { 
                            try { 
                                Thread.sleep(3000); 
                            } catch (InterruptedException e) { 
                                e.printStackTrace(); 
                            } 
                        } 
                    } 
                } 
            }).start(); 
        } 
        //----------------------------------------------------------------------------------  
        private void checkSysInfo(final JLabel updateInfo){ 
            new Thread(new Runnable(){ 
                public void run(){ 
                    String info = ""; 
                    while(true){ 
                        try{ 
                            netFilePath = preferences.get("updatePath", "EQ.jar"); 
                            if(netFilePath.equals("EQ.jar")){ 
                                info = "<html><center><font color=red><b>无法登录</b><br>未设置升级路径</font></center></html>"; 
                                updateInfo.setText(info); 
                                continue; 
                            } 
                            netFile = new File(netFilePath); 
                            if(netFile.exists()){ 
                                Date netDate = new Date(netFile.lastModified()); 
                                if(!localFile.exists()){ 
                                    info = "<html><font color=blue>本地程序位置出错!</font></html>"; 
                                }else{ 
                                    Date localDate = new Date(localFile.lastModified()); 
                                    if(netDate.after(localDate)){ 
                                        info = "<html><font color=blue>网络上有最新程序!</font></html>"; 
                                        pushMessage(info); 
                                    }else{ 
                                        info = "<html><font color=green>现在是最新程序!</font></html>"; 
                                    } 
                                } 
                            }else{ 
                                info = "<html><center><font color=red><b>无法访问</b><br>升级路径</font></center></html>"; 
                            } 
                            updateInfo.setText(info); 
                            Thread.sleep(5*1000); 
                        }catch(InterruptedException e){ 
                            e.printStackTrace(); 
                        } 
                    } 
                } 
            }).start(); 
        } 
        //----------------------------------------------------------------------------------  
        class SearchUserActionListener implements ActionListener{ 
            private final JList list; 
            SearchUserActionListener(JList list){ 
                this.list = list; 
            } 
     
            @Override 
            public void actionPerformed(ActionEvent e) { 
                // TODO Auto-generated method stub  
                if(searchUserButton.isSelected()){ 
                    searchUserButton.setText("停止搜索"); 
                    new Thread(new Runnable(){ 
                        public void run(){ 
                            Resource.searchUsers(chatTree, progressBar,list, searchUserButton); 
                        } 
                    }).start(); 
                }else{ 
                    searchUserButton.setText("搜索新用户"); 
                } 
                 
            } 
        } 
        //----------------------------------------------------------------------------------  
        class SysSetPanelOKListener implements ActionListener{ 
     
            @Override 
            public void actionPerformed(ActionEvent e) { 
                // TODO Auto-generated method stub  
                String command = e.getActionCommand(); 
                if(command.equals("sysOK")){ 
                    String updatePath = updatePathTField.getText(); 
                    String placardPath = placardPathTField.getText(); 
                    String pubPath = pubPathTField.getText(); 
                    preferences.put("updatePath", updatePath); // 设置系统升级路径  
                    preferences.put("placardPath", placardPath);// 设置系统公告路径  
                    preferences.put("pubPath", pubPath); // 设置公共程序路径  
                    JOptionPane.showMessageDialog(EQ.this, "系统设置保存完毕"); 
                } 
                if (command.equals("loginOK")) { 
                    String username = userNameTField.getText(); 
                    String password = new String(passwordTField.getPassword()); 
                    preferences.put("username", username); // 设置系统升级路径  
                    preferences.put("password", password);// 设置系统公告路径  
                    JOptionPane.showMessageDialog(EQ.this, "登录设置保存完毕"); 
                } 
                if (command.equals("ipOK")) { 
                    String ipStart = ipStartTField.getText(); 
                    String ipEnd = ipEndTField.getText(); 
                    try { 
                        InetAddress.getByName(ipStart); 
                        InetAddress.getByName(ipEnd); 
                    } catch (UnknownHostException e1) { 
                        JOptionPane.showMessageDialog(EQ.this, "IP地址格式错误"); 
                        return; 
                    } 
                    preferences.put("ipStart", ipStart); // 设置系统升级路径  
                    preferences.put("ipEnd", ipEnd);// 设置系统公告路径  
                    JOptionPane.showMessageDialog(EQ.this, "IP设置保存完毕"); 
                } 
            } 
        } 
        //----------------------------------------------------------------------------------  
        private final class SysUpdateListener implements ActionListener{// 系统更新事件  
     
            @Override 
            public void actionPerformed(final ActionEvent e) { 
                // TODO Auto-generated method stub  
                String username = preferences.get("username", null); 
                String password = preferences.get("password", null); 
                if(username == null || password == null){ 
                    pushMessage("未设置登录升级服务器的用户名或密码"); 
                    return; 
                } 
                Resource.loginPublic(username, password); 
                updateProject(); 
            } 
        } 
        //----------------------------------------------------------------------------------  
        private class ChatTreeMouseListener extends MouseAdapter{// 用户列表的监听器  
            public void mouseClicked(final MouseEvent e){ 
                if (e.getClickCount() == 2) { 
                    TreePath path = chatTree.getSelectionPath(); 
                    if (path == null) 
                        return; 
                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) path 
                            .getLastPathComponent(); 
                    User user = (User) node.getUserObject(); 
                    try { 
                        TelFrame.getInstance(ss, new DatagramPacket(new byte[0], 0, 
                                InetAddress.getByName(user.getIp()), 1111), 
                                chatTree); 
                    } catch (IOException e1) { 
                        e1.printStackTrace(); 
                    } 
                } 
            } 
        } 
        //----------------------------------------------------------------------------------  
        private void server(){// 服务器启动方法  
            new Thread(new Runnable(){ 
                public void run(){ 
                    while(true){ 
                        if(ss != null){ 
                            byte[] buf = new byte[4096]; 
                            DatagramPacket dp = new DatagramPacket(buf,buf.length); 
                            try{ 
                                ss.receive(dp); 
                            }catch(IOException e){ 
                                e.printStackTrace(); 
                            } 
                            TelFrame.getInstance(ss,dp,chatTree); 
                        } 
                    } 
                } 
            }).start(); 
        } 
        //----------------------------------------------------------------------------------  
        private void addUserPopup(Component component, final JPopupMenu popup){// 添加用户弹出菜单  
            component.addMouseListener(new MouseAdapter(){ 
                public void mousePressed(MouseEvent e){ 
                    if(e.isPopupTrigger()){ 
                        showMenu(e); 
                    } 
                } 
                public void mouseReleased(MouseEvent e) { 
                    if (e.isPopupTrigger()) 
                        showMenu(e); 
                } 
                private void showMenu(MouseEvent e){ 
                    if(chatTree.getSelectionPaths() == null){ 
                        popupMenu.getComponent(0).setEnabled(false); 
                        popupMenu.getComponent(2).setEnabled(false); 
                        popupMenu.getComponent(3).setEnabled(false); 
                        popupMenu.getComponent(4).setEnabled(false); 
                        popupMenu.getComponent(5).setEnabled(false); 
                    }else{ 
                        if(chatTree.getSelectionPaths().length < 2){ 
                            popupMenu.getComponent(3).setEnabled(false); 
                        }else { 
                            popupMenu.getComponent(3).setEnabled(true); 
                        } 
                        popupMenu.getComponent(0).setEnabled(true); 
                        popupMenu.getComponent(2).setEnabled(true); 
                        popupMenu.getComponent(4).setEnabled(true); 
                        popupMenu.getComponent(5).setEnabled(true); 
                    } 
                    popup.show(e.getComponent(), e.getX(), e.getY()); 
                } 
            }); 
        } 
        //----------------------------------------------------------------------------------  
        private void saveLocation(){// 保存主窗体位置的方法  
            location = getBounds(); 
            dao.updateLocation(location); 
        } 
        //----------------------------------------------------------------------------------  
        protected JPopupMenu getPopupMenu(){// 创建用户弹出菜单  
            if (popupMenu == null) { 
                popupMenu = new JPopupMenu(); 
                popupMenu.setOpaque(false); 
            } 
            final JMenuItem rename = new JMenuItem(); 
            popupMenu.add(rename); 
            rename.addActionListener(new RenameActionListener()); 
            rename.setText("更名"); 
            final JMenuItem addUser = new JMenuItem(); 
            addUser.addActionListener(new AddUserActionListener()); 
            popupMenu.add(addUser); 
            addUser.setText("添加用户"); 
            final JMenuItem delUser = new JMenuItem(); 
            delUser.addActionListener(new delUserActionListener()); 
            popupMenu.add(delUser); 
            delUser.setText("删除用户"); 
            final JMenuItem messagerGroupSend = new JMenuItem(); 
            messagerGroupSend 
                    .addActionListener(new messagerGroupSendActionListener()); 
            messagerGroupSend.setText("信使群发"); 
            popupMenu.add(messagerGroupSend); 
            final JMenuItem accessComputerFolder = new JMenuItem("访问主机资源"); 
            accessComputerFolder.setActionCommand("computer"); 
            popupMenu.add(accessComputerFolder); 
            accessComputerFolder 
                    .addActionListener(new accessFolderActionListener()); 
            final JMenuItem accessPublicFolder = new JMenuItem(); 
            popupMenu.add(accessPublicFolder); 
            accessPublicFolder.setOpaque(false); 
            accessPublicFolder.setText("访问公共程序"); 
            accessPublicFolder.setActionCommand("public"); 
            accessPublicFolder.addActionListener(new accessFolderActionListener()); 
            return popupMenu; 
        } 
        //----------------------------------------------------------------------------------  
        private void updateProject(){// 程序更新方法  
            netFilePath = preferences.get("updatePath", "EQ.jar"); 
            if(netFilePath.equals("EQ.jar")){ 
                pushMessage("未设置升级路径"); 
                return; 
            } 
            netFile = new File(netFilePath); 
            localFile = new File(user_dir + File.separator + "EQ.jar"); 
            if (localFile != null && netFile != null && netFile.exists() 
                    && localFile.exists()) { 
                Date netDate = new Date(netFile.lastModified()); 
                Date localDate = new Date(localFile.lastModified()); 
                if (netDate.after(localDate)) { 
                    new Thread(new Runnable() { 
                        public void run() { 
                            try { 
                                Dialog frameUpdate = new UpdateFrame(); 
                                frameUpdate.setVisible(true); 
                                Thread.sleep(2000); 
                                FileInputStream fis = new FileInputStream(netFile); 
                                FileOutputStream fout = new FileOutputStream( 
                                        localFile); 
                                int len = fis.available(); 
                                if (len > 0) { 
                                    byte[] data = new byte[len]; 
                                    if (fis.read(data) > 0) { 
                                        fout.write(data); 
                                    } 
                                } 
                                fis.close(); 
                                fout.close(); 
                                frameUpdate.setVisible(false); 
                                frameUpdate = null; 
                                showMessageDialog("更新完毕,请重新启动程序。"); 
                            } catch (Exception e) { 
                                e.printStackTrace(); 
                            } 
                        } 
                    }).start(); 
                } else { 
                    showMessageDialog("已经是最新的程序了。"); 
                } 
            } 
        } 
        //----------------------------------------------------------------------------------  
        private void checkPlacard() { // 检测公告信息方法  
            String placardDir = preferences.get("placardPath", null); 
            if (placardDir == null) { 
                pushMessage("未设置公告路径"); 
                return; 
            } 
            File placard = new File(placardDir); 
            try { 
                if (placard.exists() && placard.isFile()) { 
                    StringBuilder placardStr = new StringBuilder(); 
                    Scanner sc = new Scanner(new FileInputStream(placard)); 
                    while (sc.hasNextLine()) { 
                        placardStr.append(sc.nextLine()); 
                    } 
                    pushMessage(placardStr.toString()); 
                } 
            } catch (FileNotFoundException e) { 
                pushMessage("公告路径错误,或公告文件不存在"); 
            } 
        } 
        //----------------------------------------------------------------------------------  
        public void setStatic(String str){// 设置状态栏信息  
            if(stateLabel != null){ 
                stateLabel.setText(str); 
            } 
        } 
         
        public void pushMessage(String info){// 堆压信息  
            if(!messageStack.contains(info)){ 
                messageStack.push(info); 
            } 
        } 
         
        private void showMessageDialog(String message){ 
            JOptionPane.showMessageDialog(this, message); 
        } 
        //----------------------------------------------------------------------------------  
        private String showInputDialog(String str){// 显示输入对话框  
            String newName = JOptionPane.showInputDialog(this, 
                    "<html>输入<font color=red>" + str + "</font>的新名字</html>"); 
            return newName; 
        } 
        private class accessFolderActionListener implements ActionListener {// 访问资源  
            public void actionPerformed(final ActionEvent e) { 
                TreePath path = chatTree.getSelectionPath(); 
                if (path == null) 
                    return; 
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) path 
                        .getLastPathComponent(); 
                User user = (User) node.getUserObject(); 
                String ip = "\\\\"+user.getIp(); 
                String command = e.getActionCommand(); 
                if (command.equals("computer")) { 
                    Resource.startFolder(ip); 
                } 
                if (command.equals("public")) { 
                    String serverPaeh = preferences.get("pubPath", null); 
                    if (serverPaeh == null) { 
                        pushMessage("未设置公共程序路径"); 
                        return; 
                    } 
                    Resource.startFolder(serverPaeh); 
                } 
            } 
        } 
     
        private class RenameActionListener implements ActionListener {// 更名  
            public void actionPerformed(final ActionEvent e) { 
                TreePath path = chatTree.getSelectionPath(); 
                if (path == null) 
                    return; 
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) path 
                        .getLastPathComponent(); 
                User user = (User) node.getUserObject(); 
                String newName = showInputDialog(user.getName()); 
                if (newName != null && !newName.isEmpty()) { 
                    user.setName(newName); 
                    dao.updateUser(user); 
                    DefaultTreeModel model = (DefaultTreeModel) chatTree.getModel(); 
                    model.reload(); 
                    chatTree.setSelectionPath(path); 
                    initUserInfoButton(); 
                } 
            } 
        } 
        private class FrameWindowListener extends WindowAdapter { 
            public void windowClosing(final WindowEvent e) {// 系统关闭事件  
                setVisible(false); 
            } 
        } 
        private class AddUserActionListener implements ActionListener { 
            public void actionPerformed(final ActionEvent e) {// 添加用户  
                String ip = JOptionPane.showInputDialog(EQ.this, "输入新用户IP地址"); 
                if (ip != null) 
                    chatTree.addUser(ip, "add"); 
            } 
        } 
        private class delUserActionListener implements ActionListener { 
            public void actionPerformed(final ActionEvent e) {// 删除用户  
                chatTree.delUser(); 
            } 
        } 
        private class messagerGroupSendActionListener implements ActionListener {// 信使群发  
            public void actionPerformed(final ActionEvent e) { 
                String message = JOptionPane.showInputDialog(EQ.this, "请输入群发信息", 
                        "信使群发", JOptionPane.INFORMATION_MESSAGE); 
                if (message != null && !message.equals("")) { 
                    TreePath[] selectionPaths = chatTree.getSelectionPaths(); 
                    Resource.sendGroupMessenger(selectionPaths, message); 
                } else if (message != null && message.isEmpty()) { 
                    JOptionPane.showMessageDialog(EQ.this, "不能发送空信息!"); 
                } 
            } 
        } 
        private void SystemTrayInitial() { // 系统栏初始化  
            if (!SystemTray.isSupported()) // 判断当前系统是否支持系统栏  
                return; 
            try { 
                String title = "TT"; 
                String company = "成都市同道科技有限公司"; 
                SystemTray sysTray = SystemTray.getSystemTray(); 
                Image image = Toolkit.getDefaultToolkit().getImage( 
                        EQ.class.getResource("/icons/sysTray.png"));// 系统栏图标  
                trayicon = new TrayIcon(image, title + "\n" + company, createMenu()); 
                trayicon.setImageAutoSize(true); 
                trayicon.addActionListener(new SysTrayActionListener()); 
                sysTray.add(trayicon); 
                trayicon.displayMessage(title, company, MessageType.INFO); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
        } 
        private PopupMenu createMenu() { // 创建系统栏菜单的方法  
            PopupMenu menu = new PopupMenu(); 
            MenuItem exitItem = new MenuItem("退出"); 
            exitItem.addActionListener(new ActionListener() { // 系统栏退出事件  
                        public void actionPerformed(ActionEvent e) { 
                            System.exit(0); 
                        } 
                    }); 
            MenuItem openItem = new MenuItem("打开"); 
            openItem.addActionListener(new ActionListener() {// 系统栏打开菜单项事件  
                        public void actionPerformed(ActionEvent e) { 
                            if (!isVisible()) { 
                                setVisible(true); 
                                toFront(); 
                            } else 
                                toFront(); 
                        } 
                    }); 
     
            // 系统栏的访问服务器菜单项事件  
            MenuItem publicItem = new MenuItem("访问服务器"); 
            publicItem.addActionListener(new ActionListener() { 
                public void actionPerformed(ActionEvent e) { 
                    String serverPaeh = preferences.get("pubPath", null); 
                    if (serverPaeh == null) { 
                        pushMessage("未设置公共程序路径"); 
                        return; 
                    } 
                    Resource.startFolder(serverPaeh); 
                } 
            }); 
            menu.add(publicItem); 
            menu.add(openItem); 
            menu.addSeparator(); 
            menu.add(exitItem); 
            return menu; 
        } 
        class SysTrayActionListener implements ActionListener {// 系统栏双击事件  
            public void actionPerformed(ActionEvent e) { 
                setVisible(true); 
                toFront(); 
            } 
        } 
    } 
分享到:
评论

相关推荐

    QQ聊天系统 一个模拟QQ的聊天系统

    QQ聊天系统是一个模拟腾讯QQ功能的聊天应用程序,旨在提供类似QQ的实时通讯体验。这个系统可能包括用户注册、登录、好友添加、群组创建、发送消息、接收消息、表情发送、文件传输等功能,旨在帮助用户进行线上沟通。...

    仿QQ聊天系统(java swing)

    【标题】"仿QQ聊天系统(java swing)"是一个基于Java Swing开发的桌面应用程序,它模仿了QQ的基本功能,提供了用户间的实时通讯服务。Swing是Java标准版(J2SE)的一部分,用于构建图形用户界面(GUI)的库,具有...

    基于qt的仿qq聊天系统实验报告.doc

    QT 编程课程考核报告基于 qt 的仿 qq 聊天系统 该实验报告详细介绍了如何使用 Qt 开发一个仿 QQ 聊天系统,涵盖了从需求分析到代码实现的全过程,适合计算机科学、软件工程和通信工程等相关专业的学生进行课程设计...

    Java模仿QQ聊天系统Java模仿QQ聊天系统Java模仿QQ聊天系统

    在本项目中,我们将探讨如何使用Java编程语言来模仿QQ聊天系统的实现。这个系统的核心功能包括用户注册与登录、好友管理、实时消息传递以及可能的群组聊天功能。以下是关于这个话题的一些关键知识点: 1. **Java...

    JSP+EXT超强仿QQ聊天系统 WEBQQ

    【标题】"JSP+EXT超强仿QQ聊天系统 WEBQQ"是一个基于JSP技术和EXT库构建的在线聊天系统,旨在模仿QQ的用户界面和功能,为用户提供类似的即时通讯体验。这个系统利用Web技术实现了跨平台的聊天功能,让用户能够在任何...

    linux下QQ聊天系统

    综上所述,“Linux下QQ聊天系统”涉及到了网络编程的多个核心概念和技术,是学习Linux开发和网络通信的一个优秀实例。开发者可以通过这个项目深入理解如何在Linux环境中实现一个完整的即时通讯应用。

    c#QQ聊天系统

    【C# QQ聊天系统】是一个基于C#编程语言开发的即时通讯软件,它模拟了QQ的基本功能,提供了用户之间的实时消息传递、好友管理、在线状态显示等核心特性。这款聊天系统设计精良,界面友好,操作简单,是学习C#编程和...

    qq聊天系统

    QQ聊天系统是一个基于C#编程语言开发的即时通讯软件,其设计目标是模仿并实现QQ2008版本的功能。这个系统提供了丰富的交互体验和多种通信方式,是学习和研究即时通讯技术的一个宝贵实例。通过分析和理解这个系统的源...

    仿QQ聊天系统

    【标题】:“仿QQ聊天系统”是一个基于Java技术实现的模拟QQ登录与通信功能的项目。这个系统旨在提供一个类似于QQ的用户体验,让用户能够在自己的计算机上进行即时通讯。 【描述】:“java仿QQ登陆系统”主要关注的...

    QQ聊天c#源码,仿QQ聊天系统的一个开放源码,各种文件齐全,绝对值得学习,不敢独享,

    在C#中开发QQ聊天系统,首先涉及到的是网络编程,尤其是TCP/IP协议的应用。TCP是一种面向连接的、可靠的传输层协议,适合用于建立稳定的聊天通信。开发者需要理解如何创建socket连接,进行数据的收发,以及如何处理...

    java实现的类似qq聊天系统

    【Java实现的类似QQ聊天系统】是一个基于Java技术构建的在线聊天平台,它模拟了QQ的基本功能,如用户注册、登录、发送和接收消息。这个系统不仅涉及到Java编程语言的基础应用,还涵盖了网络安全领域的相关知识,特别...

    java做的QQ聊天系统

    Java编写的QQ聊天系统是一个基于网络通信的即时通讯软件,其设计与实现涵盖了多个Java技术领域的知识点。在本文中,我们将深入探讨这个系统的构建过程、所涉及的关键技术和可能的优化策略。 首先,Java语言的选择是...

    QQ聊天系统参考代码

    QQ聊天系统是一个典型的即时通讯(IM)应用,它涉及到网络编程、多线程处理、数据序列化、用户界面设计等多个IT技术领域。本项目使用Visual Studio Studio作为开发工具,这是一款由微软公司推出的强大集成开发环境,...

    用JAVA实现的超酷QQ聊天系统

    本文将深入探讨如何利用Java技术栈构建一个超酷的QQ聊天系统,涵盖其核心技术和设计原则。 首先,让我们从基础开始。Java是一种面向对象的编程语言,以其跨平台兼容性、丰富的类库和强大的性能而闻名。在开发聊天...

    仿QQ聊天系统的课设

    【标题】"仿QQ聊天系统的课设"是一个项目,旨在为学习者提供一个模拟QQ聊天功能的系统。这个系统可能是为了帮助学生理解即时通讯软件的基本原理和开发过程,特别是使用C#编程语言来实现。 【描述】提到"非常牛逼的...

    qq聊天系统源码 仿qq聊天系统源码

    QQ聊天系统源码是开发即时通讯软件的一种参考实现,它基于ASP.NET技术,这是一种由微软推出的、用于构建Web应用程序的框架。ASP.NET提供了丰富的功能,包括网页生命周期管理、内置的安全性支持、状态管理以及对多种...

    java qq聊天系统源代码

    该Java QQ聊天系统源代码是一个基于Java编程语言实现的简单即时通讯软件,它模拟了QQ的基本功能,包括点对点的私聊和群聊模式。这个系统的核心在于多线程和异步通信技术的应用,使得用户可以同时进行多个聊天会话而...

Global site tag (gtag.js) - Google Analytics