Exibindo ToolTip sem eventos

0 respostas
V

Bem galera procurei muito e não consegui encontrar nada pronto , então eu mesmo escrevi um metodo para fazer isso , eu gostaria que o pessoal desse uma olhada pra ver se tem alguma coisa que poderia ser modificada pra otimizar ou alguma coisa assim !

private void showTooltip(JLabel label,final int miliseconds)
{
    PopupFactory popupFactory = PopupFactory.getSharedInstance();
    Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
    Point p = label.getLocationOnScreen();
    Point center = new Point(screen.width/2, screen.height/2);
   
    JToolTip tip = label.createToolTip();
    tip.setTipText(label.getToolTipText());
    Dimension tipDim = tip.getPreferredSize();
    
    //Posiciona e centraliza o popup(tooltip) em relacao ao label (Horizontal)
    int x = p.x+(label.getSize().width/2);
    x = x-(tipDim.width/2);

    //Posiciona e abaixa o popup(tooltip) para descobrir o label (Vertical)
    int y = p.y+(label.getSize().height) + 10;
    
    //Reajuste , garante exibicao dentre os limites da tela (Horizontal)
    if(p.x > center.x)  {
        int posX = (int)center.distance(x,center.y) + tipDim.width;
        if( posX > center.x )
            x = x - (posX - center.x);
    }
    else    {
        int posX = (int)center.distance(x,center.y);
        if( posX > center.x )
            x = x + (posX - center.x);
    }
            
    //Reajuste , garante exibicao dentre os limites da tela (Vertical)
    if(p.y > center.y)  {
        int posY = (int)center.distance(center.x,y) + tipDim.height;
        if( posY > center.y )
            y = y - (posY - center.y);
    }
    else    {
        int posY = (int)center.distance(center.x,y);
        if( posY > center.y )
            y = y + (posY - center.y);
    } 
          
    final Popup popup = popupFactory.getPopup(label, tip, x, y);          
    
    Thread toShowThread = new Thread()  {         
        public void run()   {
            popup.show();
            try{Thread.sleep(miliseconds);}
            catch(InterruptedException ex){ex.printStackTrace();}
            popup.hide();
        }
    };      
    toShowThread.start();
}

Funciona tudo perfeitamente , mas existem alguns incovenientes !

  • Enquanto um tooptip esta sendo exibido , nada impede que outro
    seja exibido também dando uma “sujada na tela” . Gostaria que a atual
    fosse fechada e a nova fosse mostrada .
  • Se eu reposicionar a janela enquanto o tooptip esta sendo exibido
    ele permanece no local onde estava . Gostaria que ele acompanhasse o label.

Esse delay que eu criei ai , eu não gostei muito também nao , sera que teria
alguma outra forma .

Se alguém tiver algumas dicas …

Criado 10 de setembro de 2008
Respostas 0
Participantes 1