SystemTray travando ao iniciar o jetty

0 respostas
khaoz

Já tenho código funcional (porém não finalizado) de uma aplicação que irá utilizar o jetty embarcado. Ao iniciar a aplicação, eu coloco um ícone na bandeja do sistema para executar algumas operações.
Se o jetty for inicializado durante a execução do método run() tudo funciona corretamente, mas se eu clicar no menu “Parar Servidor” e depois inicializar tudo novamente no “Iniciar Servidor” o tray trava e não exibe mais o menu.
O mesmo acontece se eu não iniciar o jetty no método run() deixando para o usuário clicar no “Iniciar Servidor” na primeira execução do aplicativo.

Alguma idéia do que pode ser ?

Segue abaixo o código da classe principal e da classe que manipula o jetty.

package com.giulianisanches;

import com.giulianisanches.http.ServerHandler;
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;

public class LocalBridge {

    private Image image;
    private TrayIcon trayIcon;
    private ServerHandler bridgeHandler;
    private PopupMenu popupMenu;

    private void initComponents() {
        bridgeHandler = new ServerHandler();
        image = Toolkit.getDefaultToolkit().getImage("images/network.png");
        popupMenu = new PopupMenu();
        trayIcon = new TrayIcon(image, "JLocalBridge", popupMenu);

    }

    private void buildPopupMenu() {
        MenuItem menuExit = new MenuItem("Sair");
        MenuItem menuStart = new MenuItem("Iniciar servidor");
        MenuItem menuStop = new MenuItem("Parar servidor");

        menuExit.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                bridgeHandler.stopServer();
                System.exit(0);
            }
        });

        menuStart.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                bridgeHandler.startServer();
            }
        });

        menuStart.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                bridgeHandler.stopServer();
            }
        });

        popupMenu.add(menuStart);
        popupMenu.add(menuStop);
        popupMenu.add(menuExit);
    }

    public void run() {
        if (SystemTray.isSupported()) {
            initComponents();

            SystemTray tray = SystemTray.getSystemTray();

            try {
                tray.add(trayIcon);

                buildPopupMenu();

                bridgeHandler.startServer();
            } catch (AWTException ex) {
                JOptionPane.showMessageDialog(null,
                        "Não foi possível adicionar o aplicativo na bandeja do sistema.");
            }
        } else {
            JOptionPane.showMessageDialog(null,
                    "Não possui suporte a bandeja dom sistema.");
        }
    }

    public static void main(String[] args) {
        LocalBridge localBridge = new LocalBridge();
        localBridge.run();
    }
}
package com.giulianisanches.http;

import com.giulianisanches.servlets.FilePrint;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;

public class ServerHandler {

    private Server server;
    private Context context;

    public ServerHandler() {
        server = new Server(8888);
        context = new Context(server, "/", Context.SESSIONS);

        addServlets();
    }

    private void addServlets() {
        context.addServlet(new ServletHolder(new FilePrint()), "/file");
    }

    public void startServer() {
        if (!server.isRunning()) {
            try {
                server.start();

                server.join();
            } catch (InterruptedException ex) {
                Logger.getLogger(ServerHandler.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(ServerHandler.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void stopServer() {
        if (server.isRunning()) {
            try {
                server.stop();
            } catch (Exception ex) {
                Logger.getLogger(ServerHandler.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
Criado 26 de outubro de 2008
Respostas 0
Participantes 1