无法在分配了ToolTipText的选项卡之间切换(JTabbedPane)

时间:2013-11-11 16:05:18

标签: java swing tabs jlabel jtabbedpane

我有一个实现多标签聊天的JFrame扩展类。每个标签都是与某人或一群人聊天。我实现的工作正常,除非我将ToolTipText分配给选项卡的标签。在这种情况下,我不能再单击(并选择)分配了ToolTipText的选项卡。其他工作正常。

图形示例: enter image description here

如您所见,正确添加了标签,前两个标签(“Gruppo prova”和“Gruppo test”)有一个ToolTipText,另外两个没有。我可以在最后两个之间切换,但我不能对前两个做同样的事情。我认为标签旁边的图标可能有问题,但我删除它仍然无法正常工作。但是我仍然可以点击所有'X'(关闭)按钮(正常工作)。

这是我用来添加标签的代码片段:

        // Some stuff...
        JChat chat = new JChat(gui.chatClient, email, name, group);
        jTabbedPane.add(email, chat); // I instantiated this before

        int index = jTabbedPane.indexOfTab(email);
        JPanel pnlTab = new JPanel(new GridBagLayout());
        pnlTab.setOpaque(false);

        // Core function
        JLabel lblTitle;

        if (group == 1) {
        // If it's a group and not a single chat I assign a name, an icon and a ToolTipText to the tab
            lblTitle = new JLabel(name, icon, JLabel.LEFT);
            lblTitle.setToolTipText(membersList.toString());
        } else {
        // otherwise I only assign a name to the tab
            lblTitle = new JLabel(name);
        }

        jTabbedPane.setTabComponentAt(index, pnlTab);

        // This applies the 'X' (close) button next to the tab name
        CloseButton btnClose = new CloseButton(this, jTabbedPane, tabs, email);

        lblTitle.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));

        pnlTab.add(lblTitle);
        pnlTab.add(btnClose);

这是一个Swing bug还是我做错了什么?

1 个答案:

答案 0 :(得分:4)

你可以使用:

  1. void setToolTipTextAt(int, String)将工具提示文本设置为特定标签。
  2. void setIconAt(int index, Icon icon)将图标设置为特定标签。
  3. 无需使用JLabel来设置tool-tip texticon

    然而,上述解决方案无法回答您的问题:

      

    除非我将ToolTipText分配给选项卡的标签。在这   case我不能再单击(并选择)具有ToolTipText的选项卡   分配

    我怀疑的唯一理由:

    默认情况下,

    JLabel不会注册到任何鼠标侦听器。当没有鼠标侦听器设置为JLabel时,任何鼠标单击事件都将转到下面的UI对象:在这种情况下为JTabbedPane。但是,当我们使用setToolTipText(text)设置工具提示文本时,ToolTipManger会向此JLabel添加一个鼠标侦听器,它将继续使用鼠标单击事件。

    检查以下代码段,演示问题并提供setSelectedIndex功能的解决方法:

        JLabel label = new  JLabel("a Label");
        System.out.println(label.getMouseListeners().length); // length is printed as 0
    
        label.setToolTipText("Danger: setting tool tip will consume mouse event");
        System.out.println(label.getMouseListeners().length); // length is printed as 1
    
        jTabbedPane1.setTabComponentAt(0, label);
    
        label.addMouseListener(new MouseAdapter() {
    
            @Override
            public void mouseClicked(MouseEvent e) {
               int index =  jTabbedPane1.indexOfTabComponent((Component)e.getSource());
               jTabbedPane1.setSelectedIndex(index);
            }
    
        });