我有一个实现多标签聊天的JFrame扩展类。每个标签都是与某人或一群人聊天。我实现的工作正常,除非我将ToolTipText分配给选项卡的标签。在这种情况下,我不能再单击(并选择)分配了ToolTipText的选项卡。其他工作正常。
图形示例:
如您所见,正确添加了标签,前两个标签(“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还是我做错了什么?
答案 0 :(得分:4)
你可以使用:
void setToolTipTextAt(int, String)
将工具提示文本设置为特定标签。void setIconAt(int index, Icon icon)
将图标设置为特定标签。 无需使用JLabel
来设置tool-tip text
或icon
。
然而,上述解决方案无法回答您的问题:
除非我将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);
}
});