Java 具有swing系统托盘图标的高CPU使用率

Java 具有swing系统托盘图标的高CPU使用率,java,swing,system-tray,Java,Swing,System Tray,在我使用的一个简单的swing应用程序中 代码正常,创建托盘,设置图标,添加事件。但当应用程序使用系统托盘执行时,CPU使用率高达50%。如果未使用系统托盘代码,则CPU使用情况良好。如何解决这个问题 编辑: 下面是代码,虽然不是完整的源代码,但主要的两个java文件如下: package ui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.MenuItem; import java.awt.

在我使用的一个简单的swing应用程序中

代码正常,创建托盘,设置图标,添加事件。但当应用程序使用系统托盘执行时,CPU使用率高达50%。如果未使用系统托盘代码,则CPU使用情况良好。如何解决这个问题

编辑: 下面是代码,虽然不是完整的源代码,但主要的两个java文件如下:

package ui;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import msg.HighlightInterface;

/**
 *
 * @author user
 */
public class Window extends JFrame implements HighlightInterface {

    private HashMap<Integer, ChatPanel> tabMap;
    private About aboutDialog;
    private Window thisWindow;
    private TrayIcon trayIcon;
    private PopupMenu trayMenu;

    @Override
    public void messageReceived(String text) {
        if (trayIcon != null && !isFocused()) {
            trayIcon.displayMessage("Msg", text, TrayIcon.MessageType.INFO);
        }
    }

    private class ServerDaemon extends Thread {

        private ServerSocket serverSocket;

        @Override
        public void run() {
            try {
                serverSocket = new ServerSocket(7777);
                System.out.println("Listening for connections : ");
                while (true) {
                    Socket client;
                    while ((client = serverSocket.accept()) != null) {
                        ChatPanel chatPanel = new ChatPanel(client);
                        chatPanel.addHighlightListener(thisWindow);
                        tabPane.add(client.getInetAddress().toString(), chatPanel);
                        System.out.println(client.getRemoteSocketAddress() + " -> connected.");
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                Dialogs.showErrorDialog("This application is already running or error while initialization.");
                System.exit(-1);
            }
        }
    }
    private NewDialog newDialog;

    /**
     * Creates new form Window
     */
    public Window() {
        thisWindow = this;
        initComponents();
        setComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        tabPane = new JTabbedPane();
        menuBar = new JMenuBar();
        fileMenu = new JMenu();
        newMenuItem = new JMenuItem();
        closeMenuItem = new JMenuItem();
        exitMenuItem = new JMenuItem();
        helpMenu = new JMenu();
        aboutMenuItem = new JMenuItem();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        getContentPane().add(tabPane, BorderLayout.CENTER);

        fileMenu.setText("Msg");

        newMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
        newMenuItem.setText("New");
        newMenuItem.setToolTipText("New chat.");
        newMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                newMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(newMenuItem);

        closeMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, InputEvent.CTRL_MASK));
        closeMenuItem.setText("Close");
        closeMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                closeMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(closeMenuItem);

        exitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, InputEvent.ALT_MASK));
        exitMenuItem.setText("Exit");
        exitMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                exitMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(exitMenuItem);

        menuBar.add(fileMenu);

        helpMenu.setText("Help");

        aboutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
        aboutMenuItem.setText("About");
        aboutMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                aboutMenuItemActionPerformed(evt);
            }
        });
        helpMenu.add(aboutMenuItem);

        menuBar.add(helpMenu);

        setJMenuBar(menuBar);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void newMenuItemActionPerformed(ActionEvent evt) {//GEN-FIRST:event_newMenuItemActionPerformed
        showNewDialog();
    }//GEN-LAST:event_newMenuItemActionPerformed

    private void closeMenuItemActionPerformed(ActionEvent evt) {//GEN-FIRST:event_closeMenuItemActionPerformed
        closeWindow();
    }//GEN-LAST:event_closeMenuItemActionPerformed

    private void exitMenuItemActionPerformed(ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
        closeApp();
    }//GEN-LAST:event_exitMenuItemActionPerformed

    private void aboutMenuItemActionPerformed(ActionEvent evt) {//GEN-FIRST:event_aboutMenuItemActionPerformed
        showAbout();
    }//GEN-LAST:event_aboutMenuItemActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            final Window window = new Window();
            window.new ServerDaemon().start();
            java.awt.EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    window.setVisible(true);
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
            Dialogs.showErrorDialog(ex.getMessage());
        }
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private JMenuItem aboutMenuItem;
    private JMenuItem closeMenuItem;
    private JMenuItem exitMenuItem;
    private JMenu fileMenu;
    private JMenu helpMenu;
    private JMenuBar menuBar;
    private JMenuItem newMenuItem;
    private JTabbedPane tabPane;
    // End of variables declaration//GEN-END:variables

    private void setComponents() {
        try {
            trayMenu = new PopupMenu();
            MenuItem closeMenuItem = new MenuItem("Exit");
            closeMenuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    closeApp();
                }
            });
            trayMenu.add(closeMenuItem);
            trayIcon = new TrayIcon(ImageIO.read(Window.class.getResource("/res/chat.png")), "Msg", trayMenu);
            trayIcon.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 1) {
                        setState(JFrame.NORMAL);
                        setVisible(true);
                        toFront();
                    }
                }
            });
            if (SystemTray.isSupported()) {
                SystemTray.getSystemTray().add(trayIcon);
            }

            newDialog = new NewDialog(this);
            aboutDialog = new About(this);
            tabMap = new HashMap<Integer, ChatPanel>();

            addWindowListener(new WindowAdapter() {

                @Override
                public void windowIconified(WindowEvent e) {
                    setVisible(false);
                }

            });
            setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            setTitle("Msg");
            setSize(400, 380);
            setLocationRelativeTo(null);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void showNewDialog() {
        newDialog.setVisible(true);
    }

    public void connectToClient(String ip, String name) {
        if (name.length() == 0) {
            name = System.getProperty("user.name");
        }
        try {
            Socket socket = new Socket(ip, 7777);
            ChatPanel chatPanel = new ChatPanel(socket);
            tabPane.add(ip, chatPanel);
            tabMap.put(tabPane.indexOfComponent(chatPanel), chatPanel);
        } catch (Exception ex) {
            ex.printStackTrace();
            Dialogs.showErrorDialog("Connection not established !, May be this application "
                    + "is not running in other system or it may be a network error !");
        }
    }

    private void closeWindow() {
        if (tabPane.getTabCount() > 0) {
            Component component = tabPane.getSelectedComponent();
            if (component instanceof ChatPanel) {
                ((ChatPanel) component).closeConnection();
                tabPane.remove(tabPane.getSelectedIndex());
            }
        }
    }

    private void showAbout() {
        aboutDialog.setVisible(true);
    }

    private void closeApp() {
        System.exit(0);
    }
}
packageui;
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.MenuItem;
导入java.awt.PopupMenu;
导入java.awt.SystemTray;
导入java.awt.TrayIcon;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.InputEvent;
导入java.awt.event.KeyEvent;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.util.HashMap;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JMenu;
导入javax.swing.JMenuBar;
导入javax.swing.JMenuItem;
导入javax.swing.JTabbedPane;
导入javax.swing.KeyStroke;
导入javax.swing.UIManager;
导入javax.swing.WindowConstants;
导入msg.HighlightInterface;
/**
*
*@author用户
*/
公共类窗口扩展JFrame实现HighlightInterface{
私有HashMap-tabMap;
私密的关于阿伯塔洛;
私人窗口;
私人运输公司;
私有弹出菜单菜单;
@凌驾
已接收公共无效消息(字符串文本){
if(trayIcon!=null&&!isFocused()){
trayIcon.displayMessage(“Msg”,文本,trayIcon.MessageType.INFO);
}
}
私有类ServerDaemon扩展线程{
私有服务器套接字服务器套接字;
@凌驾
公开募捐{
试一试{
serverSocket=新的serverSocket(7777);
System.out.println(“侦听连接:”);
while(true){
套接字客户端;
而((client=serverSocket.accept())!=null){
ChatPanel ChatPanel=新的ChatPanel(客户端);
chatPanel.addHighlightListener(此窗口);
tabPane.add(client.getInetAddress().toString(),chatPanel);
System.out.println(client.getRemoteSocketAddress()+“->已连接”);
}
}
}捕获(例外情况除外){
例如printStackTrace();
Dialogs.batherRorDialog(“此应用程序已在运行或初始化时出错”);
系统退出(-1);
}
}
}
私有NewDialog NewDialog;
/**
*创建新窗体窗口
*/
公共窗口(){
这个窗口=这个;
初始化组件();
setComponents();
}
@抑制警告(“未选中”)
////GEN-BEGIN:初始化组件
私有组件(){
tabPane=新的JTabbedPane();
menuBar=newjmenubar();
fileMenu=newjmenu();
newMenuItem=new JMenuItem();
closeMenuItem=new JMenuItem();
exitMenuItem=新的JMenuItem();
helpMenu=newjmenu();
aboutMenuItem=新JMenuItem();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
getContentPane().add(选项卡窗格,BorderLayout.CENTER);
fileMenu.setText(“Msg”);
newMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));
newMenuItem.setText(“新”);
setToolTipText(“新聊天”);
newMenuItem.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件evt){
执行的新菜单操作(evt);
}
});
fileMenu.add(newMenuItem);
closeMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,InputEvent.CTRL_MASK));
closeMenuItem.setText(“关闭”);
addActionListener(新建ActionListener()){
已执行的公共无效操作(操作事件evt){
已执行的CloseMenuItemAction(evt);
}
});
fileMenu.add(closeMenuItem);
setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK));
exitMenuItem.setText(“退出”);
exitMenuItem.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件evt){
exitMenuItemActionPerformed(evt);
}
});
fileMenu.add(exitMenuItem);
菜单栏。添加(文件菜单);
helpMenu.setText(“帮助”);
aboutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));
aboutMenuItem.setText(“关于”);
aboutMenuItem.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件evt){
关于已执行的操作(evt);
}
});
helpMenu.add(关于菜单项);
菜单栏。添加(帮助菜单);
setJMenuBar(菜单栏);
包装();
}////GEN-END:initComponents
private void newMenuItemActionPerformed(ActionEvent evt){//GEN-FIRST:event\u newMenuItemActionPerformed
showNewDialog();
}//GEN-LAST:已执行事件\u newMenuItemAction
私有无效closeMenuItemActionPerformed(ActionEvent evt){//GEN-FIRST:event\u closeMenuItemActionPerformed
关闭窗口();
}//GEN-LAST:已执行事件\关闭菜单操作
私有无效exitMenuItemActionPerformed(ActionEvent evt){//GEN-FIRST:event\u exitMenuItemActionPerformed
closeApp();
}//GEN-LAST:已执行事件\u exitMenuItemAction
private void aboutMenuItemActionPerformed(ActionEvent evt){//GEN-FIRST:event_aboutMenuItemActionPerformed
炫耀();
}//GEN-LAST:已执行的关于菜单项操作的事件
/**
*@param指定命令行参数
*/
公共静态空间
package ui;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import msg.HighlightInterface;

/**
 *
 * @author user
 */
public class Window extends JFrame implements HighlightInterface {

    private HashMap<Integer, ChatPanel> tabMap;
    private About aboutDialog;
    private Window thisWindow;
    private TrayIcon trayIcon;
    private PopupMenu trayMenu;

    @Override
    public void messageReceived(String text) {
        if (trayIcon != null && !isFocused()) {
            trayIcon.displayMessage("Msg", text, TrayIcon.MessageType.INFO);
        }
    }

    private class ServerDaemon extends Thread {

        private ServerSocket serverSocket;

        @Override
        public void run() {
            try {
                serverSocket = new ServerSocket(7777);
                System.out.println("Listening for connections : ");
                while (true) {
                    Socket client;
                    while ((client = serverSocket.accept()) != null) {
                        ChatPanel chatPanel = new ChatPanel(client);
                        chatPanel.addHighlightListener(thisWindow);
                        tabPane.add(client.getInetAddress().toString(), chatPanel);
                        System.out.println(client.getRemoteSocketAddress() + " -> connected.");
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                Dialogs.showErrorDialog("This application is already running or error while initialization.");
                System.exit(-1);
            }
        }
    }
    private NewDialog newDialog;

    /**
     * Creates new form Window
     */
    public Window() {
        thisWindow = this;
        initComponents();
        setComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        tabPane = new JTabbedPane();
        menuBar = new JMenuBar();
        fileMenu = new JMenu();
        newMenuItem = new JMenuItem();
        closeMenuItem = new JMenuItem();
        exitMenuItem = new JMenuItem();
        helpMenu = new JMenu();
        aboutMenuItem = new JMenuItem();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        getContentPane().add(tabPane, BorderLayout.CENTER);

        fileMenu.setText("Msg");

        newMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
        newMenuItem.setText("New");
        newMenuItem.setToolTipText("New chat.");
        newMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                newMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(newMenuItem);

        closeMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, InputEvent.CTRL_MASK));
        closeMenuItem.setText("Close");
        closeMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                closeMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(closeMenuItem);

        exitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, InputEvent.ALT_MASK));
        exitMenuItem.setText("Exit");
        exitMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                exitMenuItemActionPerformed(evt);
            }
        });
        fileMenu.add(exitMenuItem);

        menuBar.add(fileMenu);

        helpMenu.setText("Help");

        aboutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
        aboutMenuItem.setText("About");
        aboutMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                aboutMenuItemActionPerformed(evt);
            }
        });
        helpMenu.add(aboutMenuItem);

        menuBar.add(helpMenu);

        setJMenuBar(menuBar);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void newMenuItemActionPerformed(ActionEvent evt) {//GEN-FIRST:event_newMenuItemActionPerformed
        showNewDialog();
    }//GEN-LAST:event_newMenuItemActionPerformed

    private void closeMenuItemActionPerformed(ActionEvent evt) {//GEN-FIRST:event_closeMenuItemActionPerformed
        closeWindow();
    }//GEN-LAST:event_closeMenuItemActionPerformed

    private void exitMenuItemActionPerformed(ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
        closeApp();
    }//GEN-LAST:event_exitMenuItemActionPerformed

    private void aboutMenuItemActionPerformed(ActionEvent evt) {//GEN-FIRST:event_aboutMenuItemActionPerformed
        showAbout();
    }//GEN-LAST:event_aboutMenuItemActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            final Window window = new Window();
            window.new ServerDaemon().start();
            java.awt.EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    window.setVisible(true);
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
            Dialogs.showErrorDialog(ex.getMessage());
        }
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private JMenuItem aboutMenuItem;
    private JMenuItem closeMenuItem;
    private JMenuItem exitMenuItem;
    private JMenu fileMenu;
    private JMenu helpMenu;
    private JMenuBar menuBar;
    private JMenuItem newMenuItem;
    private JTabbedPane tabPane;
    // End of variables declaration//GEN-END:variables

    private void setComponents() {
        try {
            trayMenu = new PopupMenu();
            MenuItem closeMenuItem = new MenuItem("Exit");
            closeMenuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    closeApp();
                }
            });
            trayMenu.add(closeMenuItem);
            trayIcon = new TrayIcon(ImageIO.read(Window.class.getResource("/res/chat.png")), "Msg", trayMenu);
            trayIcon.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 1) {
                        setState(JFrame.NORMAL);
                        setVisible(true);
                        toFront();
                    }
                }
            });
            if (SystemTray.isSupported()) {
                SystemTray.getSystemTray().add(trayIcon);
            }

            newDialog = new NewDialog(this);
            aboutDialog = new About(this);
            tabMap = new HashMap<Integer, ChatPanel>();

            addWindowListener(new WindowAdapter() {

                @Override
                public void windowIconified(WindowEvent e) {
                    setVisible(false);
                }

            });
            setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            setTitle("Msg");
            setSize(400, 380);
            setLocationRelativeTo(null);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void showNewDialog() {
        newDialog.setVisible(true);
    }

    public void connectToClient(String ip, String name) {
        if (name.length() == 0) {
            name = System.getProperty("user.name");
        }
        try {
            Socket socket = new Socket(ip, 7777);
            ChatPanel chatPanel = new ChatPanel(socket);
            tabPane.add(ip, chatPanel);
            tabMap.put(tabPane.indexOfComponent(chatPanel), chatPanel);
        } catch (Exception ex) {
            ex.printStackTrace();
            Dialogs.showErrorDialog("Connection not established !, May be this application "
                    + "is not running in other system or it may be a network error !");
        }
    }

    private void closeWindow() {
        if (tabPane.getTabCount() > 0) {
            Component component = tabPane.getSelectedComponent();
            if (component instanceof ChatPanel) {
                ((ChatPanel) component).closeConnection();
                tabPane.remove(tabPane.getSelectedIndex());
            }
        }
    }

    private void showAbout() {
        aboutDialog.setVisible(true);
    }

    private void closeApp() {
        System.exit(0);
    }
}
package ui;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import javax.swing.GroupLayout;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.LayoutStyle;
import msg.HighlightInterface;

/**
 *
 * @author user
 */
public class ChatPanel extends JPanel {

    private static ArrayList<HighlightInterface> highlightListeners;

    static{
        highlightListeners=new ArrayList<HighlightInterface>();
    }

    public static void addHighlightListener(HighlightInterface h){
        highlightListeners.add(h);
    }

    private class EnterListener extends KeyAdapter {

        @Override
        public void keyReleased(KeyEvent e) {
            if (e.getKeyChar() == KeyEvent.VK_ENTER && msg.getText().length() > 0) {
                sendMsg(msg.getText());
                inbox.setText(inbox.getText() + "me : " + msg.getText());
                msg.setText("");
            }
        }
    }
    private Socket socket;
    private DataInputStream in;
    private DataOutputStream out;
    private boolean showError = true;

    /**
     * Creates new form ChatPanel
     */
    public ChatPanel(Socket socket) {
        this.socket = socket;
        initComponents();
        setComponents();
    }

    private void setComponents() {
        try {
            if (socket != null) {
                in = new DataInputStream(socket.getInputStream());
                out = new DataOutputStream(socket.getOutputStream());
                new Thread() {
                    @Override
                    public void run() {
                        try {
                            String text = null;
                            while (true) {
                                while (in.available() > 0) {
                                    text = in.readUTF();
                                    if (text != null) {
                                        text = socket.getInetAddress().toString() + " : " + text;
                                        inbox.setText(inbox.getText() + text);
                                        informToAll(text);
                                    }
                                }
                            }
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            if (showError) {
                                Dialogs.showErrorDialog(ex.getMessage());
                            }
                        }
                    }
                }.start();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            Dialogs.showErrorDialog(ex.getMessage());
        }
        inbox.setEditable(false);
        msg.addKeyListener(new EnterListener());
        msg.requestFocus();
    }

    private void sendMsg(String text) {
        try {
            if (out != null) {
                out.writeUTF(text);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            Dialogs.showErrorDialog("I can't send your message :(");
        }
    }

    public void closeConnection() {
        try {
            if (socket != null) {
                showError = false;
                in.close();
                out.close();
                socket.close();
                System.out.println("connection closed!");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            Dialogs.showErrorDialog(ex.getMessage());
        }
    }

    private void informToAll(String text){
        if(highlightListeners!=null){
            for(HighlightInterface h :highlightListeners)
                h.messageReceived(text);
        }
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new JScrollPane();
        inbox = new ChatPane();
        jScrollPane2 = new JScrollPane();
        msg = new ChatPane();

        jScrollPane1.setViewportView(inbox);

        jScrollPane2.setViewportView(msg);

        GroupLayout layout = new GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, GroupLayout.DEFAULT_SIZE, 299, Short.MAX_VALUE)
                    .addComponent(jScrollPane2))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, GroupLayout.PREFERRED_SIZE, 191, GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane2, GroupLayout.DEFAULT_SIZE, 52, Short.MAX_VALUE)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    public ChatPane inbox;
    private JScrollPane jScrollPane1;
    private JScrollPane jScrollPane2;
    public ChatPane msg;
    // End of variables declaration//GEN-END:variables
}