将工具提示添加到JTextPane

我想在JTextPane中只添加一些工具提示。 例如,如果JTextPane中有引用链接文本,我想在该文本中添加工具提示以显示链接。 有什么办法可以实现这个function吗?

好问题。

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

comp.setToolTipText("google");

问题是使此工具提示可单击。

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

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

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

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

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

  public static void main(String[] args) throws InterruptedException, InvocationTargetException { final JFrame f = new JFrame("test"); f.setSize(100, 100); JLabel l = new JLabel("google"); l.setToolTipText("google"); 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); } 

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

使用MouseEvent,您可以使用viewToModel(…)方法将offest导入Document。 然后,您可以获取属性以确定您是否将鼠标hover在链接上。

或者更简单的方法是使用getCursor()方法。 当光标是手形光标时,您将通过链接。

然后,您可以返回当前链接的相应工具提示文本。

您可以尝试在jtextpane中加载HTML页面。 这是一个例子。 关于这个例子的更多解释可以在这里找到

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

通常,JTextPane可以包含多个链接,因此TooltipText应该显示链接吗?

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