如何让JEditorPane像在JTextArea中一样显示文本?

时间:2014-04-09 12:31:18

标签: java swing jtextarea jtextpane jeditorpane

我想让JEditorPane显示JTextArea中的文字。使用JEditorPane的原因是我想在特定文本模式上创建链接(使用a href)。我调查了JTextPane,但没有找到一种简单的方法。文本是填充的,因此填充和保留正确的空格数很重要。显示屏之间的差异如下所示: enter image description here

我希望JEditorPane以与JTextArea(左侧)完全相同的方式显示文字。也许,还有另一种更好的方法吗?像1233这样的文本会有链接,一旦我将文本显示正确,就会触发相关的事件监听器。

代码:

import javax.swing.*;
import javax.swing.text.JTextComponent;
import java.awt.*;

public class Test {
    public static void main(String[] args)throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    final static String sampleText=
            "\n" +
                    "    1233 2001/16/07       This is test\n" +
                    "                          With padding\n" +
                    "                               more padding\n" +
                    "                               and more padding";

    private static void createAndShowGUI() {
        final JFrame frame = new JFrame("test");
        //final JTextComponent textComponent=new JTextArea();
        final JEditorPane textComponent=new JEditorPane();
        textComponent.setContentType("text/html");
        textComponent.setFont(textComponent.getFont().deriveFont(11.5f));// larger font
        textComponent.setText(sampleText);
        frame.getContentPane().add(textComponent);
        frame.setPreferredSize(new Dimension(370,120));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }
}

使用纯文本时,这可以是一个解决方案:

textComponent.setFont(new JTextArea().getFont().deriveFont(11.5f));

但格式化已丢失。因此,当我将contentType设置为" text / html"时,这不起作用。设置内容类型时JEditorPane(即使使用Monospaced字体):

enter image description here

1 个答案:

答案 0 :(得分:1)

解决方案是,无论textComponent是什么(JTextArea还是JEditorPane):

    textComponent.setFont(new JTextArea().getFont().deriveFont(11.5f));

这会强制JEditorPane使用与JTextArea相同的字体。此外,将空格替换为html实体和换行符<br>

    sampleText=sampleText.replaceAll("\n","<br>").replaceAll("\\s","&nbsp;");