好吧,我知道帖子的标题很熟悉。我看到了很多关于这个主题的帖子,但没有一个涉及 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
..等等。
您能给我一些关于如何在用户单击链接时更改颜色的建议吗?
在侦听器中,您可以获取文本中的位置。然后将您的
JEditorPane's
Document
转换为 StyledDocument
并使用 getCharacterElement()
传递您拥有的偏移量。对于 Element
,您可以使用 setCharacterAttributes()
方法更改属性,例如背景或前景。
感谢 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()
}
}