解决setToolTipText吞噬鼠标事件的方法?

7

这似乎是SWING的一个已验证的问题

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

我目前正在尝试设置JTabbedPane中选项卡的工具提示文本,但是当我这样做时,我实际上无法选择该选项卡,因为工具提示添加了一个消耗事件的鼠标侦听器。

有人知道一种解决方法,可以让我保留工具提示和鼠标事件吗?谢谢。

按要求,以下是我的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
我怀疑工具提示并没有消耗鼠标事件。选项卡是通过鼠标单击来选择的。工具提示是由鼠标进入和移动事件生成的。请发布您的SSCCE(http://sscce.org)以展示问题。 - camickr
好的,我已经添加了我的 SSCCEE 以展示问题。 - Sandro
我明白你的意思了,SSCCE澄清了问题。 - camickr
2个回答

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);
    }
}

太棒了。虽然远非理想,但能完成工作。谢谢! - Sandro

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);


            }
        });

    }


}

很抱歉给您带来了麻烦。我正在使用自定义的选项卡组件,为其添加工具提示会出现问题。 - Sandro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接