向 JTextPane 添加工具提示

发布于 2024-11-18 09:07:05 字数 100 浏览 1 评论 0原文

我想仅向 JTextPane 内的特定文本添加一些工具提示。例如,如果 JTextPane 中有一个参考链接文本,我想向该文本添加一个工具提示以显示该链接。有什么办法可以实现这个功能吗?

I want to add some tooltips to only a certain text inside a JTextPane. As an example, if there is a reference link text inside the JTextPane I want to add a tooltip to that text to show the link. Is there any way I can achieve this functionality?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

枫林﹌晚霞¤ 2024-11-25 09:07:05

好问题。

First Swing 支持 HTML,因此要显示带有链接的工具提示,您只需输入:

comp.setToolTipText("google");

问题在于使该工具提示可点击。

不幸的是,它不是由 Swing 本身完成的。

工具提示由 ToolTipManager 创建。当您调用 setToolTipText() 时,JComponent 将其自身实例添加到负责显示工具提示的工具提示管理器的共享实例(使用无法覆盖的方法 show() )。您无法更改工具提示管理器本身因此

,我建议的最佳解决方案是执行以下操作。
您可以使用 Toolkit.getDefaultToolkit().addAWTEventListener() 监听 AWT 事件,

因此,当显示工具提示时捕获它、发现并在其上添加鼠标侦听器。该鼠标侦听器将使工具提示本身可点击。

这是我刚刚写的练习。您可以将其用作参考。祝你好运。

    public static void main(String[] args) throws InterruptedException, InvocationTargetException {
        final JFrame f = new JFrame("test");
        f.setSize(100, 100);


        JLabel l = new JLabel("<html><a href='http://www.google.com'>google</a></html>");
        l.setToolTipText("<html><a href='http://www.google.com'>google</a></html>");


        long mask = AWTEvent.COMPONENT_EVENT_MASK |
//      AWTEvent.CONTAINER_EVENT_MASK |
//      AWTEvent.FOCUS_EVENT_MASK |
//      AWTEvent.KEY_EVENT_MASK |
//      AWTEvent.MOUSE_EVENT_MASK |
//      AWTEvent.MOUSE_MOTION_EVENT_MASK |
        AWTEvent.WINDOW_EVENT_MASK |
        AWTEvent.ACTION_EVENT_MASK |
        AWTEvent.ADJUSTMENT_EVENT_MASK |
        AWTEvent.ITEM_EVENT_MASK |
        AWTEvent.TEXT_EVENT_MASK;

        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
            @Override
            public void eventDispatched(AWTEvent event) {
                int id = event.getID();
                Object source = event.getSource();
                if (id == 101 && source instanceof JToolTip) {
                    JToolTip tooltip = (JToolTip)source;

                    //System.out.println("" + event.getID() + " " + event.getSource());

                }

            }
        }, mask);
        f.add(l);
        f.setVisible(true);
    }

Good question.

First Swing supports HTML, so to show tooltip with link you just have to say:

comp.setToolTipText("<html><a href='http://www.google.com'>google</a></html>");

The problem is making this tooltip clickable.

Unfortunately it is not done by Swing itself.

Tooltip is created by ToolTipManager. When you call setToolTipText() Jcomponent adds the instance of itself to shared instance of Tooltip manager that is responsible on showing the tooltip (using method show() that cannot be overridden. You cannot change the tooltip manager itself too.

So, the best solution I can suggest is to do the following.
You can listen to the AWT events using Toolkit.getDefaultToolkit().addAWTEventListener()

So, when tooltip is being showed catch it, discover, and add mouse listener on it. This mouse listener will make the tooltip itself clickable.

Here is the exercise I have just written. You can use it as a reference. Good luck.

    public static void main(String[] args) throws InterruptedException, InvocationTargetException {
        final JFrame f = new JFrame("test");
        f.setSize(100, 100);


        JLabel l = new JLabel("<html><a href='http://www.google.com'>google</a></html>");
        l.setToolTipText("<html><a href='http://www.google.com'>google</a></html>");


        long mask = AWTEvent.COMPONENT_EVENT_MASK |
//      AWTEvent.CONTAINER_EVENT_MASK |
//      AWTEvent.FOCUS_EVENT_MASK |
//      AWTEvent.KEY_EVENT_MASK |
//      AWTEvent.MOUSE_EVENT_MASK |
//      AWTEvent.MOUSE_MOTION_EVENT_MASK |
        AWTEvent.WINDOW_EVENT_MASK |
        AWTEvent.ACTION_EVENT_MASK |
        AWTEvent.ADJUSTMENT_EVENT_MASK |
        AWTEvent.ITEM_EVENT_MASK |
        AWTEvent.TEXT_EVENT_MASK;

        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
            @Override
            public void eventDispatched(AWTEvent event) {
                int id = event.getID();
                Object source = event.getSource();
                if (id == 101 && source instanceof JToolTip) {
                    JToolTip tooltip = (JToolTip)source;

                    //System.out.println("" + event.getID() + " " + event.getSource());

                }

            }
        }, mask);
        f.add(l);
        f.setVisible(true);
    }
摇划花蜜的午后 2024-11-25 09:07:05

覆盖:文本窗格的 getToolTipText(MouseEvent event) 方法。

使用 MouseEvent,您可以使用 viewToModel(...) 方法将offest放入文档中。然后,您可以获取属性来确定您是否将鼠标悬停在链接上。

或者也许更简单的方法是使用 getCursor() 方法。当光标为手形光标时,您位于链接上方。

然后您可以为当前链接返回适当的工具提示文本。

Override: getToolTipText(MouseEvent event) method of the text pane.

Using the MouseEvent you can use the viewToModel(...) method to get the offest into the Document. Then you can get the attributes to determine if you are hovering over a link.

Or maybe an easier approach is to use the getCursor() method. When the cursor is the hand cursor you are over a link.

Then you can return the appropriate tool tip text for the current link.

红衣飘飘貌似仙 2024-11-25 09:07:05

您可以尝试在 jtextpane 中加载 HTML 页面。 这里是一个示例。有关此示例的更多说明可以在 此处< /a>

You can try loading of HTML pages in the jtextpane. Here is an example. More explanation about this example can be found here

只是偏爱你 2024-11-25 09:07:05

您可以将 TooltipText 添加到 JComponent(如 JTextPane),而不是添加到组件的单词或部分。

通常,JTextPane 可以包含多个链接,那么 TooltipText 应该显示哪个链接呢?

但是,如果检测到链接,您可以向 JTextPane 添加一个监听器,删除旧的工具提示,然后添加一个新的工具提示。

You can add a TooltipText to a JComponent, like a JTextPane, not to words or parts of the Component.

Normally a JTextPane can contain multiple links, so for which should the TooltipText show the link?

But you can add a Listener to the JTextPane, and remove the old Tooltip, and add a new one, if you detect a Link.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文