Java Can';t在已分配ToolTiptText的选项卡之间切换(JTabbedPane)

Java Can';t在已分配ToolTiptText的选项卡之间切换(JTabbedPane),java,swing,tabs,jlabel,jtabbedpane,Java,Swing,Tabs,Jlabel,Jtabbedpane,我有一个JFrame扩展类,它实现了多选项卡聊天。每个标签都是与某人或一群人的聊天。除了将ToolTiptText指定给选项卡的标签外,我所实现的一切工作正常。在这种情况下,我无法再单击(并选择)已指定ToolTiptText的选项卡。其他的都很好 图形示例: 正如您所看到的,选项卡被正确添加,前两个选项卡(“Gruppo prova”和“Gruppo test”)有一个ToolTipText,其他两个没有。我可以在最后两个之间切换,但前两个我做不到。我原以为标签旁边的图标可能有问题,但我把它

我有一个JFrame扩展类,它实现了多选项卡聊天。每个标签都是与某人或一群人的聊天。除了将ToolTiptText指定给选项卡的标签外,我所实现的一切工作正常。在这种情况下,我无法再单击(并选择)已指定ToolTiptText的选项卡。其他的都很好

图形示例:

正如您所看到的,选项卡被正确添加,前两个选项卡(“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还是我做错了什么?

您可以使用:

  • 将工具提示文本设置为特定选项卡
  • 将图标设置为特定选项卡 无需使用
    JLabel
    设置
    工具提示文本
    图标

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

    除非我将ToolTipText指定给选项卡的标签。在这个 如果我无法再单击(并选择)包含ToolTipText的选项卡 指派

    我怀疑的唯一原因是:

    默认情况下,
    JLabel
    不会注册到任何鼠标侦听器。当没有鼠标侦听器设置为
    JLabel
    时,任何鼠标单击的事件都将进入下面的UI对象:在这种情况下,
    JTabbedPane
    。但是,当我们使用
    setToolTipText(text)
    设置工具提示文本时,
    ToolTimpAnger
    将鼠标侦听器添加到此
    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);
            }
    
        });
    
    您可以使用:

  • 将工具提示文本设置为特定选项卡
  • 将图标设置为特定选项卡 无需使用
    JLabel
    设置
    工具提示文本
    图标

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

    除非我将ToolTipText指定给选项卡的标签。在这个 如果我无法再单击(并选择)包含ToolTipText的选项卡 指派

    我怀疑的唯一原因是:

    默认情况下,
    JLabel
    不会注册到任何鼠标侦听器。当没有鼠标侦听器设置为
    JLabel
    时,任何鼠标单击的事件都将进入下面的UI对象:在这种情况下,
    JTabbedPane
    。但是,当我们使用
    setToolTipText(text)
    设置工具提示文本时,
    ToolTimpAnger
    将鼠标侦听器添加到此
    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);
            }
    
        });
    

    @PierpaoloBagnasco,不太可能是一个bug,但组件设计问题。检查更新的答案做得很好,感谢您的解释和深入研究@PierpaoloBagnasco,不太可能是一个bug,但组件设计问题。检查更新的答案做得很好,感谢您的解释和深入研究!