如何将可点击文本插入JTextPane?

时间:2015-05-04 22:21:42

标签: java html swing jtextpane

我已经开了几天聊天程序了,我完全不知道如何在不使用HTML的情况下创建漂亮的可点击文本。我尝试使用HTML,但结果非常奇怪(见下文)。所以我现在正在使用 基本文本而不是text / html。

clickable text with html

我首次尝试添加可点击的文字是使用JTextPane能够插入Component和文本。它插入并完美地工作,但它垂直偏移,看起来非常糟糕。我试图弄乱setAlignmentY,但没有运气将组件与文本对齐。

    JLabel l = new JLabel(test);
    l.setFont(this.getFont());
    l.setCursor(new Cursor(Cursor.HAND_CURSOR));
    l.setBackground(Color.RED); //Just so i could see it better for testing
    l.addMouseListener(new FakeMouseListener());
    this.insertComponent(l);  

我正在使用JTextPane并使用doc.insertString插入文字。我使用系统行分隔符跳过行,因此一行可以包含多个doc.insertString s(尝试使用text / html时遇到了麻烦)。

2 个答案:

答案 0 :(得分:2)

这会插入HTML而不会出现任何对齐问题。我认为("思考"因为我没有足够的代码知道)当我使用Document.insertString时因HTMLEditorKit.insertHTML而遇到问题。

public class Example extends JFrame {

    Example() {

        JEditorPane pane = new JEditorPane();
        pane.setEditable(false);
        pane.setContentType("text/html");
        HTMLDocument doc = (HTMLDocument) pane.getDocument();
        HTMLEditorKit editorKit = (HTMLEditorKit) pane.getEditorKit();

        try {
            editorKit.insertHTML(doc, doc.getLength(), "<a href=\"http://click.com\">clickable1</a>", 0, 0, null);
            editorKit.insertHTML(doc, doc.getLength(), "<a href=\"c2\">clickable2</a>", 0, 0, null);
            editorKit.insertHTML(doc, doc.getLength(), "<a href=\"c3\">clickable3</a>", 0, 0, null);
        } catch (BadLocationException | IOException e) {
            e.printStackTrace();
        }

        pane.addHyperlinkListener(new HyperlinkListener() {

            @Override
            public void hyperlinkUpdate(HyperlinkEvent e) {

                if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
                    System.out.println(e.getSourceElement());
                    if (e.getURL() != null)
                        System.out.println(e.getURL());
                    else
                        System.out.println(e.getDescription());
                    System.out.println("-----");
                }
            }
        });

    add(pane);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {

        new Example();
    }
}

备注:

    必须要求
  • setEditable(false)才能使其正常工作(可能有一些令人费解的方式使其正常工作)。
  • HyperlinkListener只是为了证明链接有效,以及如何获取链接字符串的一些演示(getURL仅在链接是有效URL时才有效。)
  • 无论是否有HyperlinkListener,您都不需要设置光标。

答案 1 :(得分:0)

结果我把setAlignmentY(0.85f);放到了JTextPane而不是JLable。

如果你有一个偏移组件,你试图插入JTextPane,那就搞乱它的Y对齐。 0.85f适合我。