Problema com posicao da classe ou codigo

bom dia a todos!!!
pessoal, estou fazendo uns testes com uns programas no Sistray e ele tá funcionando, aparecem os menus de saída e tal, tudo como tem que ser…
beleza…
aí, lanço um while com sleep para a cada tantos segundos ele executar determinadas tarefas e tal…beleza…isso também funciona(ainda estou construindo e está bem rustico, mas a mecânica parece correta)
beleza…
só que apesar do código funcionar e o programa aparecer os menus somem…
é o único erro que notei até agora…
bom, aí, ia fazer o seguinte , lançar uma variável no começo da classe(main) e dar o valor para ela no construtor, mas não funcionou…queria umas dicas para resolver isso…estou tentando usar a lógica de php mas sem sucesso(ok, eu sei, java é java, e php e php, mas mesmo assim, não custa tentar né?)
bom, deixa eu parar de digitar e lançar o código aí para vocês verem…


package misc;  
/*
 * TrayIconDemo.java
 */

import classes.Inicio;
import classes.Varreduras;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

public class Systray_Teste extends Thread{
 

 int valorDeretorno;   
    
    
    
public static void main(String[] args) {

  /* Use an appropriate Look and Feel */
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); /*UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");*/ 
            } 
        catch (UnsupportedLookAndFeelException ex) {} 
        catch (IllegalAccessException ex) {} 
        catch (InstantiationException ex) {} 
        catch (ClassNotFoundException ex) {}
        /* Turn off metal's use of bold fonts */
        UIManager.put("swing.boldMetal", Boolean.FALSE);
        //Schedule a job for the event-dispatching thread:
        //adding TrayIcon.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    ///aqui e o final do construtor dessa classe      
   
}
   
   


    
    @SuppressWarnings("SleepWhileInLoop")
    private static void createAndShowGUI() {
        //Check the SystemTray support
        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray is not supported");
            return;
        }
        
                
        
        final PopupMenu popup = new PopupMenu();
        final TrayIcon trayIcon = new TrayIcon(createImage("images/icon.gif", "tray icon"));
        final SystemTray tray = SystemTray.getSystemTray();
        
        // Create a popup menu components
        MenuItem aboutItem = new MenuItem("About");
        
        
        Menu displayMenu = new Menu("Display");
        /*******************************************/
        MenuItem errorItem = new MenuItem("Erro");
        MenuItem warningItem = new MenuItem("Alerta");
        MenuItem exitItem = new MenuItem("Exit");
        /*******************************************/
       
       
        //Add components to popup menu
        popup.add(aboutItem);
        
        popup.add(displayMenu);
        displayMenu.add(errorItem);
        displayMenu.add(warningItem);
        
        popup.add(exitItem);
        
trayIcon.setPopupMenu(popup);
try {tray.add(trayIcon);} catch (AWTException e) {System.out.println("TrayIcon could not be added."); return; }
trayIcon.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null,"This dialog box is run from System Tray");}});
aboutItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {JOptionPane.showMessageDialog(null,"This dialog box is run from the About menu item");}
});
        
 //++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        
    
        /*esse é o trecho do código que tá me dando o problema...*/
        
Inicio inicioClass = new Inicio();  

String operadorSistema = inicioClass.nomeDefinido();  
String Pc =inicioClass.PC();
trayIcon.displayMessage("sistema TESTE", "bem-vindo ", TrayIcon.MessageType.ERROR); /*mensagem quando o programa for acionado!*/ 

///+++++++++++++++++++++++++++++++++++
       int valor;
        valor=0;
        while(valor < 100000)
        {
            try {
                Thread.sleep(10000);
                trayIcon.displayMessage("sistema de systray", "Teste de thread "+valor, TrayIcon.MessageType.ERROR);
            } catch (InterruptedException ex) {
                Logger.getLogger(Systray_Teste.class.getName()).log(Level.SEVERE, null, ex);
            }
        valor++;
        }
///+++++++++++++++++++++++++++++++++++
     
  /*esse é o trecho do código que tá me dando o problema...*/
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++inicio dos sistema+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++








 ActionListener listener = new ActionListener() 
 {
        public void actionPerformed(ActionEvent e) 
        {
           MenuItem item = (MenuItem)e.getSource();//TrayIcon.MessageType type = null;
           System.out.println(item.getLabel());
           if("Erro".equals(item.getLabel())) 
           {/*type = TrayIcon.MessageType.ERROR;*/trayIcon.displayMessage("Ops!","deu um erro!", TrayIcon.MessageType.ERROR);} 
           else if 
          ("Alerta".equals(item.getLabel())) 
          {/*type = TrayIcon.MessageType.WARNING;*/trayIcon.displayMessage("Novo Cliente na produção", "Fulano...você teve um cliente convertido as 15:32 de hoje", TrayIcon.MessageType.WARNING); } 
       }
};
        
        errorItem.addActionListener(listener);
        warningItem.addActionListener(listener);
    
        
        exitItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                tray.remove(trayIcon);
                System.exit(0);
            }
        });
    }
    
    //Obtain the image URL
    protected static Image createImage(String path, String description) {
        URL imageURL = Systray_Teste.class.getResource(path);
        
        if (imageURL == null) {
            System.err.println("Resource not found: " + path);
            return null;
        } else {
            return (new ImageIcon(imageURL, description)).getImage();
        }
    }
    
    
 
    
}

enfim, pessoal, o que sugerem porque o menu tá sumindo?

Esse loop infinito está deixando a thread de eventos ocupada para sempre, e ela é responsável por montar o menu e tratar os cliques. Aliás, na posição em que está, o loop não deixa nem sequer a construção da GUI terminar (nunca chega na linha 138 onde são configurados alguns ActionListeners).

Se precisa fazer algo de tempo em tempo use um Timer. Ele vai ter o comportamento esperado, que é executar o que precisa e liberar a thread de eventos até a próxima execução.
http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/Timer.html

e aí, Gomes!! beleza?
realmente o timer funcionou melhor mesmo…só que não estou conseguindo exibir a mensagem pelo sistray…como anteriormente, como posso fazer para chamar a mensagem???
fiz desse jeito no trecho com problemas:

   Timer timerTEMPO;       
   timerTEMPO = new Timer(); 
   timerTEMPO.schedule(new Varreduras(info), 6000, 4000);

o timer tá certo, só a mensagem mesmo que não consigo exibir pelo sistray…como posso resolver essa???
obrigado mais uma vez pela dica!!!
um grande abraço!!
Horácio

Primeiro, seria melhor usar esse Timer aqui: javax.swing.Timer ao invés do java.util.Timer . Ele é melhor nesse caso pois permite que a ação disparada possa interagir com os componentes da interface gráfica. (Isso acontece porque ele trabalha dentro do sistema de thread de eventos do AWT e Swing, o que não acontece com o java.util.Timer)

Depois, basta passar a instância do systray para o seu ActionListener e chamar o método de envio de mensagens de lá.
Um rascunho:

class Varreduras implements ActionListener() {
      private TrayIcon trayIcon;

      Varreduras (ClasseInfo info, TrayIcon trayIcon) {
            // Faz o que ja fazia com o objeto Info
            //..
            this.trayIcon = trayIcon; 
      }
      public void actionPerformed(ActionEvent evt) {
          // Faz a tarefa que tem que ser feita.

          trayIcon.displayMessage("sistema de systray", "Testando", TrayIcon.MessageType.ERROR);  
      }
  };
// Na parte que dispara o timer...
new Timer(delay, new Varreduras(info, trayIcon) ).start();