Adding tooltips to JTextPane

自古美人都是妖i 提交于 2019-11-29 04:03:08

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);
    }

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.

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

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!