代码之家  ›  专栏  ›  技术社区  ›  Sandro

使用鼠标事件的setToolTipText的解决方法?

  •  5
  • Sandro  · 技术社区  · 15 年前

    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 回复  |  直到 15 年前
        1
  •  4
  •   camickr    15 年前

    这里有一个解决方法:

    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);
        }
    }
    
        2
  •  1
  •   Eugene Ryzhikov    15 年前

    似乎没有任何问题(在Java6下)。这是我的密码:

    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);
    
    
                }
            });
    
        }
    
    
    }
    
    推荐文章