java - 使用replaceSelection方法在JEditorPane中可点击的HTML链接

标签 java swing hyperlink jeditorpane

我搜索了如何在JEditorPane中制作可点击的链接,发现了这个问题:

Is it possible to create programs in Java that create text to link in Chrome?

这非常有用,但我的代码使用重复语句在循环中添加链接:

JEditorPane jep = new JEditorPane();
jep.setContentType("text/html");
jep.setEditable(true);// Because replaceSelection can't work with disabled edit
for ( int i = 1; i <= 3; i++ ){
    jep.replaceSelection(
        "Welcome to <a href='https://stackoverflow.com/'>StackOverflow i </a>.");
}
jep.setEditable(false);

现在它只显示文本,没有可点击的链接。我要怎样做才能把事情做好呢?我真的需要 replaceSelection 方法。

最佳答案

HTMLDocument 上使用 replaceSelection() 插入原始字符串;您想要插入 HTML anchor 标记。你可以,

  • 您自己管理原始 HTML 文本(如下所示),并让 setText() 处理解析。

  • 使用现有的 HTMLEditorKit 之一嵌套操作。

  • 使用其中一种自定义方法 here .

image

import java.awt.Desktop;
import java.awt.HeadlessException;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;

/**
 * @see https://stackoverflow.com/a/16447176/230513
 * @see https://stackoverflow.com/a/14170141/230513
 */
public class Test {

    public static void main(String[] argv) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                display();
            }
        });
    }

    private static String create(int i) {
        StringBuilder sb = new StringBuilder();
        sb.append("Welcome to <a href=");
        sb.append("'http://www.example.com'>Example ");
        sb.append(i);
        sb.append("</a>.<br>");
        return sb.toString();
    }

    private static void display() throws HeadlessException {
        JEditorPane jep = new JEditorPane();
        jep.setContentType("text/html");
        StringBuilder sb = new StringBuilder();
        sb.append("<b>Welcome</b>:<br><hr>");
        for (int i = 1; i <= 3; i++) {
            sb.append(create(i));
        }
        sb.append("<hr>");
        jep.setText(sb.toString());
        jep.setEditable(false);
        jep.addHyperlinkListener(new HyperlinkListener() {
            @Override
            public void hyperlinkUpdate(HyperlinkEvent e) {
                if (HyperlinkEvent.EventType.ACTIVATED.equals(e.getEventType())) {
                    System.out.println(e.getURL());
                    Desktop desktop = Desktop.getDesktop();
                    try {
                        desktop.browse(e.getURL().toURI());
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });

        JFrame f = new JFrame("HyperlinkListener");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(jep);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

关于java - 使用replaceSelection方法在JEditorPane中可点击的HTML链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16444170/

相关文章:

java - java程序的运行长度编码

java - 在 Java 中将信息传送到另一个进程的首选方式是什么?

java - 行、模型行和 View 行的有趣行为 - 何时使用哪一个?

java - EclipseWindow Builder - JFrame 无法缩放

java - 随机输出图像

java - 使用 SimpleDateFormat 解析

java - 如何使按钮展开Java

html - 使用 CSS 模拟 <a target ="_top">

javascript - 链接关系查询 - 我可以创建 javascript 关系和 css 吗?

css - 带有超链接的图像 - 可点击区域超过图像