【问题标题】:How to insert clickable text into a JTextPane?如何将可点击文本插入 JTextPane?
【发布时间】:2015-07-14 11:33:35
【问题描述】:

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

我添加可点击文本的第一次尝试是使用JTextPane 的功能将Components 与文本一起插入。它插入并完美地工作,但它垂直偏移并且看起来很糟糕。我试图弄乱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.insertStrings(这是我在尝试使用 text/html 时遇到的麻烦)。

【问题讨论】:

  • 作为一个快速说明,您可以在包含文本的文本窗格中嵌入一个组件,并使该组件响应点击(某些侦听器模型,取决于组件)。
  • @user1803551 是的,这就是我已经尝试过的。问题是组件垂直偏移并且看起来非常糟糕。它有效,只是看起来很糟糕。
  • 哦,代码中的thisJTextPane。那么 HTML 有什么不好呢?也许你可以张贴一张你想要的照片,因为我不知道你所说的“看起来很糟糕”。
  • 图片是我遇到的问题。每次我插入时 - 而不是添加到当前的 HTML 元素,它会创建一个新元素,然后无论出于何种原因将插入的文本居中。很奇怪。
  • 插入标签时,您是使用 insertComponent 方法还是经典的 add 方法插入组件?

标签: java html swing jtextpane


【解决方案1】:

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

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,您都不需要设置光标。

【讨论】:

  • 在我尝试这个之前的快速问题:插入常规文本的最佳方法是什么?这是一个聊天程序,因此用户可以尝试在聊天中使用 HTML。
  • @bob 您的意思是用户将进入将显示在文本窗格中的聊天的不同组件?我会使用JTextArea,除非您希望能够将图像直接粘贴到输入组件中。
  • JTextArea 唯一的问题是它不支持聊天颜色。这就是为什么我切换到 JTextPane 基本文本。
  • @bob 聊天程序通常具有您输入的文本组件和显示对话的组件。我们在您的问题中讨论的是哪些,在这些 cmets 中讨论的是哪些?
  • @bob 如果您使用文本区域进行用户输入,如果不使用 HTML 标记,您希望他们以什么方式指示文本应该着色? “我如何将它正确地翻译成基本的 HTML 文本”将取决于用户如何告诉程序文本应该设置样式(颜色、粗体、链接...)。
【解决方案2】:

原来我把 setAlignmentY(0.85f); 放在了 JTextPane 而不是 JLable 上。

如果您尝试将偏移组件插入到 JTextPane 中,请弄乱它的 Y 对齐方式。 0.85f 适合我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    相关资源
    最近更新 更多