首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JList项中单个JList的工具提示

JList项中单个JList的工具提示
EN

Stack Overflow用户
提问于 2016-03-11 12:21:14
回答 2查看 294关注 0票数 0

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

词条由五个JLabels组成。“JLabels EN”、“n”和“star”都有说明缩写或符号含义的工具提示文本。当单词条目放在常规的JPanel中时,这是正确的,但是如果它放在JList项中,工具提示文本就不会显示--大概是被JList的(不存在的)工具提示覆盖了。

我见过像这样的答案,但它们只为JList项添加了工具提示,而不是为项目中的单个JComponents添加工具提示。

是否有任何方法,例如,更改Z-顺序,以便JLabels的工具提示是可见的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-11 16:06:59

词条由五个JLabels组成。

您不应该在ListModel中存储Swing组件。使用渲染器的目的是将数据存储在模型中,然后使用渲染器显示数据。

因此,在您的情况下,您需要创建一个具有8个属性的自定义对象。显示在标签中的文本的5个属性和工具提示文本的3个属性。然后你的渲染器将是一个有5个标签的JPanel。在呈现代码中,您只需使用来自自定义对象的数据来设置5个标签中每个标签的文本。您还可以设置工具提示文本。

接下来,您需要覆盖JList的JList方法。此代码的默认实现获取呈现程序,然后只返回呈现程序的顶部。这很简单,因为渲染器通常只是一个JLabel。

在您的示例中,逻辑会稍微复杂一些,因为呈现器中有子组件,因此需要获得子组件的工具提示。

以下是getToolTipText(...)方法的当前代码:

代码语言:javascript
运行
复制
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();
}

我感谢您需要修改的代码在这方面:

代码语言:javascript
运行
复制
p.translate(-cellBounds.x, -cellBounds.y);
newEvent = new MouseEvent(rComponent, event.getID(),

这将鼠标点从JList转换到渲染器。现在,我认为您只需要修改逻辑,在转换点得到标签,然后得到标签工具提示。

因此,新代码可能是这样的:

代码语言:javascript
运行
复制
p.translate(-cellBounds.x, -cellBounds.y);
Component label = rComponent.getComponentAt(p);

if (label == null) return super.getToolTipText();

newEvent = new MouseEvent(label, event.getID(),
票数 2
EN

Stack Overflow用户

发布于 2016-03-11 12:35:45

你很困惑。不向JList添加组件,而是使用ListRenderer。

因此,您有两个选择:您可以为JList构建您自己的自定义工具提示,或者创建您自己的JList版本

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35940172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档