【问题标题】:How to implement DocumentFilter that inserts URLs as hyperlinks in JTextPane?如何实现在 JTextPane 中将 URL 作为超链接插入的 DocumentFilter?
【发布时间】:2012-10-28 19:34:48
【问题描述】:

我有一个JTable,它使用JTextPane 作为编辑器和渲染器。我向编辑器添加了一个 keyListener,它监听“空格”字符并检查最后一个单词是否为 URL,如果是,则使用此属性将其作为超链接添加到编辑器:attrs.addAttribute(HTML.Attribute.HREF, url);。我很快发现当我粘贴文本时这不会将 URL 转换为超链接,所以我决定我需要使用 DocumentFilter 来执行此操作。

我如何创建一个DocumentFilter 来检查要插入/替换的文本是否包含 URL,以及它是否插入/替换带有 HTML.Attribute.HREF 属性的那些 URL 和其余文本?

【问题讨论】:

    标签: java swing url jtextpane documentfilter


    【解决方案1】:

    参见示例http://java-sl.com/tip_autocreate_links.html 没有必要使用 DocumentFilter。监听器就够了。

    只需用虚拟属性标记插入的内容,然后将其替换为超链接 html。

    【讨论】:

    • 我已经有类似的东西,它监听“”和“\n”,但是如果你粘贴文本,这将不起作用,这就是我需要 documentfilter 的原因。
    • 实现一个单一的方法来检查 2 个偏移量之间的文本范围。当您粘贴文本时 DocumentListener 也会被调用(可能是多次)。将事件的偏移量传递给方法并处理更改的片段。
    • 嗯 .. 有趣。虽然:在 DocumentListener 中修改通知文档时,我们不会期望出现问题吗?就像一般规则一样:永远不要在回调方法中更改调用者的状态。一直认为 DocumentFilter 是解决这些问题的(唯一)安全方法......
    • @kleopatra 我同意。这正是我坚持使用 DocumentFilter 的原因。为此目的,您对 DocumentFilter 实现有任何参考吗?
    • @Igor 不,但我只是(虽然没有尝试)获取 stani 的代码并将其移至过滤器
    【解决方案2】:
    // somewhere add text reformated as html link
    setText("<HTML>Click the <FONT color=\"#000099\"><U>link</U></FONT>"
            + " to go to the Java website.</HTML>");
    
    // somewhere add a listener for clicks
    addActionListener(new OpenUrlAction());
    
    // Define uri and open action
     final URI uri = new URI("http://java.sun.com");
        class OpenUrlAction implements ActionListener {
          @Override public void actionPerformed(ActionEvent e) {
            open(uri);
          }
        }
    
    // Define open uri method
    private static void open(URI uri) {
        if (Desktop.isDesktopSupported()) {
          try {
            Desktop.getDesktop().browse(uri);
          } catch (IOException e) { /* TODO: error handling */ }
        } else { /* TODO: error handling */ }
    

    【讨论】:

    • 我不知道我是否可以让我的问题更清楚,但我需要创建一个DocumentListener。打开链接并将默认光标转换为手形光标的其他部分已经完成。请删除此答案,因为它不符合我的问题。
    • 那你为什么不使用 HTMLEditorKit 那里也存在 HTMLEditorKit.LinkController 类。
    • 这是一个鼠标监听器,它监听鼠标点击已经添加的超链接。我希望应用在您键入时将 URL 转换为超链接。
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2023-03-11
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    相关资源
    最近更新 更多