我正在开发一个字典应用程序,该应用程序显示这样的单词条目:

词条由五个JLabels组成。“JLabels EN”、“n”和“star”都有说明缩写或符号含义的工具提示文本。当单词条目放在常规的JPanel中时,这是正确的,但是如果它放在JList项中,工具提示文本就不会显示--大概是被JList的(不存在的)工具提示覆盖了。
我见过像这这样的答案,但它们只为JList项添加了工具提示,而不是为项目中的单个JComponents添加工具提示。
是否有任何方法,例如,更改Z-顺序,以便JLabels的工具提示是可见的?
发布于 2016-03-11 16:06:59
词条由五个JLabels组成。
您不应该在ListModel中存储Swing组件。使用渲染器的目的是将数据存储在模型中,然后使用渲染器显示数据。
因此,在您的情况下,您需要创建一个具有8个属性的自定义对象。显示在标签中的文本的5个属性和工具提示文本的3个属性。然后你的渲染器将是一个有5个标签的JPanel。在呈现代码中,您只需使用来自自定义对象的数据来设置5个标签中每个标签的文本。您还可以设置工具提示文本。
接下来,您需要覆盖JList的JList方法。此代码的默认实现获取呈现程序,然后只返回呈现程序的顶部。这很简单,因为渲染器通常只是一个JLabel。
在您的示例中,逻辑会稍微复杂一些,因为呈现器中有子组件,因此需要获得子组件的工具提示。
以下是getToolTipText(...)方法的当前代码:
public String getToolTipText(MouseEvent event) {
if(event != null) {
Point p = event.getPoint();
int index = locationToIndex(p);
ListCellRenderer<? super E> r = getCellRenderer();
Rectangle cellBounds;
if (index != -1 && r != null && (cellBounds =
getCellBounds(index, index)) != null &&
cellBounds.contains(p.x, p.y)) {
ListSelectionModel lsm = getSelectionModel();
Component rComponent = r.getListCellRendererComponent(
this, getModel().getElementAt(index), index,
lsm.isSelectedIndex(index),
(hasFocus() && (lsm.getLeadSelectionIndex() ==
index)));
if(rComponent instanceof JComponent) {
MouseEvent newEvent;
p.translate(-cellBounds.x, -cellBounds.y);
newEvent = new MouseEvent(rComponent, event.getID(),
event.getWhen(),
event.getModifiers(),
p.x, p.y,
event.getXOnScreen(),
event.getYOnScreen(),
event.getClickCount(),
event.isPopupTrigger(),
MouseEvent.NOBUTTON);
String tip = ((JComponent)rComponent).getToolTipText(
newEvent);
if (tip != null) {
return tip;
}
}
}
}
return super.getToolTipText();
}我感谢您需要修改的代码在这方面:
p.translate(-cellBounds.x, -cellBounds.y);
newEvent = new MouseEvent(rComponent, event.getID(),这将鼠标点从JList转换到渲染器。现在,我认为您只需要修改逻辑,在转换点得到标签,然后得到标签工具提示。
因此,新代码可能是这样的:
p.translate(-cellBounds.x, -cellBounds.y);
Component label = rComponent.getComponentAt(p);
if (label == null) return super.getToolTipText();
newEvent = new MouseEvent(label, event.getID(),发布于 2016-03-11 12:35:45
你很困惑。不向JList添加组件,而是使用ListRenderer。
因此,您有两个选择:您可以为JList构建您自己的自定义工具提示,或者创建您自己的JList版本
https://stackoverflow.com/questions/35940172
复制相似问题