3

我需要一个具有多行单元格的 JTable,并将多个(在一个单元格中)URL 转换为可点击的超链接并支持基本样式操作(粗体、斜体、下划线),这意味着我可以在输入文本期间或之后编辑样式。我还需要它能够将样式化的单元格内容保存到数据库中。实现这一目标的最简单方法是什么?

我已经尝试创建一个自定义单元格编辑器(并解决了多行问题),它使用 JTextPane 并向其添加了关键侦听器,该侦听器在“空格”字符被释放时进行侦听,如果最后一个单词以“http://”开头,则删除它从它的文档中再次添加为带有 h​​ref 属性和蓝色的样式文本。我还添加了监听鼠标点击超链接的监听器。这一切都在编辑过程中起作用,但是当单元格失去焦点时,所有文本都变得无样式和黑色。也许是因为我使用了不同的渲染器和编辑器,但我也将关键侦听器添加到渲染器。在关闭和启动应用程序时,我在保存特别是设置表格单元格值时也遇到了巨大的问题。我应该继续尝试让它以这种方式工作,还是应该回去采取不同的方法,比如可能将 JTextPane 的内容类型设置为“text/html”。如果我这样做了,我真的不知道如何在您键入时将 URL 转换为超链接。

顺便说一句,编辑器扩展了 AbstractCellEdit,而渲染器扩展了 JTextPane。

任何帮助将不胜感激。

4

2 回答 2

2
  • 在您的方法中,您还需要一个自定义渲染器。一旦停止编辑,渲染器就会接管,因此渲染器必须支持与编辑器相同的样式选项
  • 表格中的可点击超链接并不简单。渲染器组件不是 的一部分JTable,它仅用作标记。因此,您附加到组件的所有常规事物(如MouseListenerActionListenerFocusListener、 ...)都不会被触发,因为组件不是 Swing 层次结构的一部分。如果我没记错的话,SwingX 内置了对JTables 中的超链接的支持,但不确定它们是否可以与样式化的 HTML 文档结合使用
  • 当您的编辑器扩展时JTextPane使用 aDocumentListener而不是 aKeyListener
  • 保存/加载基本上只是将您转储TableModel到持久状态并返回。这看起来像需求的简单部分
于 2012-10-19T19:04:33.947 回答
1

罗宾回答了你JTable,我会补充一下文字。

如果您不需要真正的 HTML,即带有类似 的链接<a href="http://example.com">link text</a>,那么您可以将DefaultStyledDocument其用作单元格的模型。要使以 http 为前缀的文本显示为链接,请将颜色设置为蓝色并添加下划线属性。(DefaultStyledDocument模型比简单HTMLDocument。)

为了保留格式,您应该Document在 Swing 中为每个单元格存储文本模型。

无需删除并重新插入文本即可添加样式。您可以将样式应用于文档中已有的文本,使用setCharacterAttributes方法。

而且您实际上可以重用 Swing 文本组件的渲染引擎来渲染您的单元格。您可以使用TextUI.getRootView(). 视图层次结构可以呈现您的文本并帮助您将鼠标单击转换为文本Element,您可以使用它来启动超链接。

于 2012-10-19T20:12:35.147 回答