2010-07-07 57 views
5

這似乎是一個驗證問題SWINGsetToolTipText消耗鼠標事件的解決方法?

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

目前我正在嘗試設置選項卡的工具提示文本在JTabbedPane但是當我做我實際上並不能選擇該選項卡了,因爲工具提示添加了一個消耗事件的鼠標偵聽器。

有誰知道一個解決方法,讓我保持我的工具提示和我的mouseevents?謝謝。

根據要求,這裏是我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

我懷疑工具提示消費的鼠標事件。通過鼠標點擊選擇一個標籤。工具提示由mouseEntered mouseMoved事件生成。發佈您的SSCCE(http://sscce.org)以顯示問題。 – camickr 2010-07-07 19:22:02

+0

好的,我已添加了顯示問題的SSCCEE。 – Sandro 2010-07-07 20:08:34

+0

我明白你的意思了,SSCCE澄清了這個問題。 – camickr 2010-07-07 20:52:34

回答

4

這裏有一個解決方法:

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

太棒了。雖然很不理想,但得到這份工作。謝謝! – Sandro 2010-07-08 14:10:00

1

似乎是工作沒有任何問題(Java 6中下)。這裏是我的代碼:

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

對不起,讓你度過這個麻煩。我正在使用一個自定義tabcomponent,並提供一個工具提示造成麻煩。 – Sandro 2010-07-07 20:09:13