在 Java 中单击时更改链接颜色

问题描述 投票:0回答:2

好吧,我知道帖子的标题很熟悉。我看到了很多关于这个主题的帖子,但没有一个涉及 Java 代码。我有这个

HyperlinkListener
课程:

private void editorpaneHyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) {
   // TODO add your handling code here:
   if (evt.getEventType() ==
                       HyperlinkEvent.EventType.ACTIVATED) {
                                    try {
                                        try {
    java.awt.Desktop.getDesktop().browse(evt.getURL().toURI());
                                           } catch (IOException ex) {
    Logger.getLogger(MyAssistantGUI.class.getName()).log(Level.SEVERE, null, ex);
                                        } 
                                 catch (URISyntaxException ex) {
    Logger.getLogger(MyAssistantGUI.class.getName()).log(Level.SEVERE, null, ex);
                        }
              System.out.println("Open browser: " + evt.getURL());

我尝试将样式表添加到我的

JEditorPane
,然后添加
a:active {color: #f00;}
,但它不起作用。然后我在API中看到java不支持
a:active/hoover
..等等。 您能给我一些关于如何在用户单击链接时更改颜色的建议吗?

java css swing hyperlink jeditorpane
2个回答
4
投票

在侦听器中,您可以获取文本中的位置。然后将您的

JEditorPane's
Document
转换为
StyledDocument
并使用
getCharacterElement()
传递您拥有的偏移量。对于
Element
,您可以使用
setCharacterAttributes()
方法更改属性,例如背景或前景。


0
投票

感谢 StanislavL 的回答,通过搜索,我能够调整它。

另请注意,如果由于某种原因其他代码为此提供了侦听器,您可能需要注意侦听器顺序

JEditorPane

class MyHyperlinkListener : HyperlinkListener {
    override fun hyperlinkUpdate(e: HyperlinkEvent) {
        val editorPane = e.inputEvent.component as? JEditorPane ?: return
        val styledDocument = editorPane.document as? HTMLDocument ?: return
        e.sourceElement ?: return

        val characterElement = styledDocument.getCharacterElement(e.sourceElement.startOffset)

        val style = when (e.eventType) {
            HyperlinkEvent.EventType.ENTERED -> styledDocument.getStyle("a:hover")
            HyperlinkEvent.EventType.EXITED -> styledDocument.getStyle("a.wildcard")
            else -> return
        }

        styledDocument.setCharacterAttributes(
            characterElement.startOffset,
            characterElement.endOffset - characterElement.startOffset,
            style,
            false
        )
    }
}

顺便说一句,这个侦听器可用于获取元素的矩形,例如使用

y
坐标来严格在该元素上方显示弹出窗口。

(e.inputEvent as MouseEvent).point.also { p ->
    p.y = e.inputEvent.component.y
    (editorPane as? JEditorPane)?.let { jEditorPane ->
        p.y = jEditorPane.modelToView2D(e.sourceElement.startOffset).y.toInt()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.