Java Can';t在已分配ToolTiptText的选项卡之间切换(JTabbedPane)
我有一个JFrame扩展类,它实现了多选项卡聊天。每个标签都是与某人或一群人的聊天。除了将ToolTiptText指定给选项卡的标签外,我所实现的一切工作正常。在这种情况下,我无法再单击(并选择)已指定ToolTiptText的选项卡。其他的都很好 图形示例: 正如您所看到的,选项卡被正确添加,前两个选项卡(“Gruppo prova”和“Gruppo test”)有一个ToolTipText,其他两个没有。我可以在最后两个之间切换,但前两个我做不到。我原以为标签旁边的图标可能有问题,但我把它去掉了,还是不起作用。但是,我仍然可以单击所有的“X”(关闭)按钮(工作正常) 这是我用来添加选项卡的一段代码:Java Can';t在已分配ToolTiptText的选项卡之间切换(JTabbedPane),java,swing,tabs,jlabel,jtabbedpane,Java,Swing,Tabs,Jlabel,Jtabbedpane,我有一个JFrame扩展类,它实现了多选项卡聊天。每个标签都是与某人或一群人的聊天。除了将ToolTiptText指定给选项卡的标签外,我所实现的一切工作正常。在这种情况下,我无法再单击(并选择)已指定ToolTiptText的选项卡。其他的都很好 图形示例: 正如您所看到的,选项卡被正确添加,前两个选项卡(“Gruppo prova”和“Gruppo test”)有一个ToolTipText,其他两个没有。我可以在最后两个之间切换,但前两个我做不到。我原以为标签旁边的图标可能有问题,但我把它
// 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,但组件设计问题。检查更新的答案做得很好,感谢您的解释和深入研究!