
一直以來,不少java的同志們都沒有一個完整資料來參考。把源碼貼出來,你們共享!html
- 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;
- 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;
- private ImageIcon messageAlertIcon;
- private ImageIcon messageAlertNullIcon;
- private Rectangle location;
- public static TrayIcon trayicon;
- private Dao dao;
-
- 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();
-
- 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");
- 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));
- initUserInfoButton();
- BannerPanel.add(messageAlertButton,BorderLayout.CENTER);
- messageAlertButton.addActionListener(new ActionListener(){
-
- @Override
- public void actionPerformed(ActionEvent arg0) {
- if(!messageStack.empty()){
- showMessageDialog(messageStack.pop());
- }
- }
- });
- 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("系統路徑"));
- 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) {
-
- 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