JTable 中 JEditorPane 中的超链接
我发誓...我希望这是我必须问的最后一个问题,但我快要疯了。
我有一个使用自定义 TableCellRenderer 的 JTable,它使用 JEditorPane 在 JTable 的各个单元格中显示 html。 如何处理对 JEditorPane 中显示的链接的单击?
我了解 HyperlinkListener,但没有鼠标事件通过 JTable 到达 EditorPane 来处理任何 HyperlinkEvent。
如何处理 JTable 中 JEditorPane 中的超链接?
I swear... i hope this is the last question I have to ask like this, but I'm about to go crazy.
I've got a JTable using a custom TableCellRenderer which uses a JEditorPane to display html in the individual cells of the JTable. How do I process clicking on the links displayed in the JEditorPane?
I know about HyperlinkListener but no mouse events get through the JTable to the EditorPane for any HyperlinkEvents to be processed.
How do I process Hyperlinks in a JEditorPane within a JTable?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您在 JTable 上注册一个
MouseListener
,您可以轻松获取鼠标单击点处的文本。 这可以通过使用event.getX()
和event.getY()< 从
MouseEvent
生成Point
对象来完成/代码>。 然后,将该Point
传递到JTable
的rowAtPoint(pt)
和columnAtPoint(pt)
。 从那里,您可以通过JTable.getValueAt(row, column)
获取文本。 现在您已经有了单元格的值,因此您可以确定它是否是链接,并对结果执行您想要的操作。If you register a
MouseListener
on the JTable, you could easily get the text at the mouse click point. This would be done by generating aPoint
object from theMouseEvent
, usingevent.getX()
andevent.getY()
. You then pass thatPoint
intoJTable
'srowAtPoint(pt)
andcolumnAtPoint(pt)
. From there, you can get the text viaJTable.getValueAt(row, column)
. Now you have the value of your cell, so you can determine whether it is a link or not and do what you'd like with the result.为了解决同样的问题,我没有尝试让 JEditorPane 生成事件,而是处理 JTable 生成的 MouseEvent,让侦听器弄清楚我们何时单击了链接。
这是代码。 它保留 JEditorPanes 的映射,因此请确保没有内存泄漏,并且如果表中的数据可能发生更改,请适当地清除此映射。 它对我实际使用的代码进行了稍微修改 - 在我实际使用的版本中,它仅在实际链接位于 html 中时才生成 JEditorPane,并且当不存在此类链接时不会打扰 JEditorPanes...
To solve the same problem, instead of trying have the JEditorPane produce the event, I instead processed the MouseEvent produced by the JTable, had the listener figure out when we were clicking on a link or not.
Here's code. It keeps a map of JEditorPanes, so do make sure you don't have memory leaks, and that you clear this map appropriately if the data in the table can change. It's slightly modified from the code I actually used - in the version I actually used, it only only produced JEditorPane when actually links were in the html, and didn't bother with JEditorPanes when no such links existed...
EditorPane 没有接收任何事件,因为从 TableCellRenderer 返回的组件只允许显示,而不允许拦截事件,这使得它与图像几乎相同,不允许有任何行为。 因此,即使注册了侦听器,返回的组件也永远不会“意识到”任何事件。 解决方法是在 JTable 上注册一个 MouseListener,并从那里拦截所有相关事件。
下面是我过去创建的一些类,用于允许 JButton 翻转在 JTable 中工作,但是您也应该能够重复使用其中的大部分来解决您的问题。 我为每个需要它的单元格提供了一个单独的 JButton。 这样,这个 ActiveJComponentTableMouseListener 就会计算出鼠标事件发生在哪个单元格中,并将事件分派到相应的组件。 ActiveJComponentTableCellRenderer 的工作是通过 Map 跟踪组件。
它足够智能,可以知道何时已触发事件,因此您不会积压冗余事件。 为超文本实现这一点应该没有什么不同,并且您可能仍然需要翻转。 以下是类
要使用它,您需要将侦听器注册为表格上的鼠标和运动侦听器,并在适当的单元格上注册渲染器。 如果要拦截 actionPerformed 类型事件,请重写 ActiveJComponentTableCellRenderer.initialiseComponent() ,如下所示:
The EditorPane isn't receiving any events because the component returned from the TableCellRenderer is only allowed to display, and not intercept events, making it pretty much the same as an image, with no behaviour allowed on it. Hence even when listeners are registered, the returned component is never 'aware' of any events. The work-around for this is to register a MouseListener on the JTable, and intercept all relevant events from there.
Here's some classes I created in the past for allowing JButton roll-over to work in a JTable, but you should be able to re-use most of this for your problem too. I had a separate JButton for every cell requiring it. With that, this ActiveJComponentTableMouseListener works out in which cell the mouse event occurs in, and dispatches an event to the corresponding component. It's the job of the ActiveJComponentTableCellRenderer to keep track of the components via a Map.
It's smart enough to know when it's already fired events, so you don't get a backlog of redundant events. Implementing this for hypertext shouldn't be that different, and you may still want roll-over too. Here are the classes
To use it, you want to register the listener to as mouse and motion listener on the table, and register the renderer on the appropriate cells. If you want to intercept actionPerformed type events, override ActiveJComponentTableCellRenderer.initialiseComponent() like so: