2010-07-07 3 views
5

Cela semble être un problème vérifié avec SWINGSolution de contournement pour setToolTipText qui consomme des événements de souris?

http://forums.sun.com/thread.jspa?threadID=385730

Je tente actuellement de définir le texte de l'infobulle d'un onglet dans un JTabbedPane mais quand je fais je ne peux pas sélectionner l'onglet réellement plus parce que l'info-bulle a ajouté un écouteur souris qui consomme les événements.

Est-ce que quelqu'un sait d'une solution de contournement qui me permet de garder mes info-bulles et mes mouseevents? Je vous remercie.

Comme par demande ici est ma SSCCE

package jtabbedbug; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTabbedPane; 

public class JTabBug{ 

    public static void main(String[] args) { 

     JTabbedPane jTabbedPane = new JTabbedPane(); 
     jTabbedPane.addTab("Red", new JLabel("Roses")); 
     jTabbedPane.addTab("Blue", new JLabel("Skies")); 
     jTabbedPane.addTab("Green", new JLabel("Grass")); 

     for (int i = 0; i < jTabbedPane.getTabCount(); i++) { 
     JLabel tabComponent = new JLabel(jTabbedPane.getTitleAt(i)); 
     tabComponent.setToolTipText("Tip: " + tabComponent.getText()); 
     jTabbedPane.setTabComponentAt(i, tabComponent); 
     } 

     JFrame jFrame = new JFrame("Testing"); 
     jFrame.add(jTabbedPane); 
     jFrame.setSize(400, 500); 
     jFrame.setVisible(true); 
     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

} 
+2

Je doute l'info-bulle consomme l'événement de souris. Un onglet est sélectionné par un clic de souris. Une info-bulle est générée par les événements mouseMoved mouseEntered. Publiez votre SSCCE (http://sscce.org) montrant le problème. – camickr

+0

OK J'ai ajouté mon SSCCEE montrant le problème. – Sandro

+0

Je vois ce que vous voulez dire, le SSCCE a clarifié la question. – camickr

Répondre

4

est ici une solution de contournement:

import javax.swing.*; 
import javax.swing.plaf.*; 
import java.awt.event.*; 

public class JTabBug{ 

    public static void main(String[] args) { 

     JTabbedPane jTabbedPane = new JTabbedPane() 
     { 
     @Override 
     public String getToolTipText(MouseEvent e) 
     { 
      int index = ((TabbedPaneUI)ui).tabForCoordinate(this, e.getX(), e.getY()); 

      if (index != -1) 
      { 
       JComponent component = (JComponent)getTabComponentAt(index); 
       return component.getToolTipText(); 
      } 

      return super.getToolTipText(e); 
     } 
     }; 
     ToolTipManager.sharedInstance().registerComponent(jTabbedPane); 
     jTabbedPane.addTab("Red", new JLabel("Roses")); 
     jTabbedPane.addTab("Blue", new JLabel("Skies")); 
     jTabbedPane.addTab("Green", new JLabel("Grass")); 

     for (int i = 0; i < jTabbedPane.getTabCount(); i++) { 
     JLabel tabComponent = new JLabel(jTabbedPane.getTitleAt(i)); 
     tabComponent.setToolTipText("Tip: " + tabComponent.getText()); 
     ToolTipManager.sharedInstance().unregisterComponent(tabComponent); 
     jTabbedPane.setTabComponentAt(i, tabComponent); 
     } 

     JFrame jFrame = new JFrame("Testing"); 
     jFrame.add(jTabbedPane); 
     jFrame.setSize(400, 500); 
     jFrame.setVisible(true); 
     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
+0

Génial. Bien loin de l'idéal qui obtient le travail. Je vous remercie! – Sandro

1

semble fonctionner sans aucun problème (sous Java 6). Voici mon code:

package com.twist.ui.widgets; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.SwingUtilities; 

public class Test { 

    public static void main(String[] args) { 


     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 

       JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       JTabbedPane tabs = new JTabbedPane(); 

       String s; 
       for(int i=0; i<3; i++) { 
        s = "Tab " + (i+1); 
        tabs.add(new JPanel(), s); 
        tabs.setToolTipTextAt(i, "Tooltip for " + s); 
       } 
       f.setContentPane(tabs); 


       f.setSize(400,300); 
       f.setLocationRelativeTo(null); 
       f.setVisible(true); 


      } 
     }); 

    } 


} 
+0

Désolé de vous avoir mis au courant de ce problème. J'utilise un tabcomponent personnalisé, et en donnant qu'une info-bulle provoque des problèmes. – Sandro

Questions connexes