【问题标题】:Prevent HTML JTextPane from formatting text input防止 HTML JTextPane 格式化文本输入
【发布时间】:2013-10-03 04:39:42
【问题描述】:

我编写了一个示例应用程序,它由一个JTextPane 和一个打印出文本窗格内容的按钮组成。文本窗格的内容类型设置为“text/html”。

当我输入一些文本并将其打印到控制台时,文本会自动换行。

例如,给定以下输入:

Watercress shallot radish chickweed bitterleaf bush tomato salad garlic beet greens black-eyed pea green bean salsify bell pepper. Catsear celery green bean broccoli rabe spring onion tatsoi prairie turnip wattle seed cucumber burdock. Chickweed cucumber chickpea bush tomato wakame taro fava bean arugula catsear azuki bean.

输出是这样的

Watercress shallot radish chickweed bitterleaf bush tomato salad garlic 
beet greens black-eyed pea green bean salsify bell pepper. Catsear celery 
green bean broccoli rabe spring onion tatsoi prairie turnip wattle seed 
cucumber burdock. Chickweed cucumber chickpea bush tomato wakame taro fava 
bean arugula catsear azuki bean.

有没有办法保留输入文本的格式?我打算将输入存储在数据库中,所以我用<br> 替换换行符,但文本窗格会自动插入自己的换行符。

如果有其他解决方案,我也可以尝试,但在大多数情况下,我希望能够显示 HTML,同时允许用户修改输入。

这里是示例代码。您应该能够编译并运行它。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextPane;

public class TextPaneTest extends JFrame {

    private JTextPane textPane = null;

    public static void main(String args[]) {
        new TextPaneTest();
    }

    public TextPaneTest() {

        // Main panel
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());

        // Panel holding text
        JPanel textPanel = new JPanel();
        textPanel.setLayout(new BorderLayout());

        // Text pane
        textPane = new JTextPane();
        textPane.setContentType("text/html");

        // Button
        JButton button = new JButton();
        button.setText("Print Text");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e) 
            {
                String text = textPane.getText();
                text = text.substring(text.indexOf("<body>") + 6, text.indexOf("</body>"));
                System.out.println(text);
            }
        });

        textPanel.add(textPane);
        panel.add(textPanel, BorderLayout.CENTER);
        panel.add(button, BorderLayout.SOUTH);

        // Add everything to the frame
        this.add(panel);
        this.setSize(1000, 500);
        setVisible(true);
    }
}

【问题讨论】:

  • 所以 .. 鉴于您打算以编程方式插入换行符,为什么不使用 JTextAreaJTextPane 设置为 text/plain
  • 抱歉,如有任何混淆。没有以编程方式插入换行符;用户插入的任何内容都将转换为&lt;br&gt;'s。
  • “没有以编程方式插入新行;..” 好的,但这不会改变我的建议。只需将用户输入的换行符换成实际需要的任何内容。
  • 有没有办法将其保留为 HTML 文本窗格,同时防止文本窗格添加自己的换行符?
  • 创建自己的HTMLEditorKit?

标签: java swing jtextpane


【解决方案1】:
    textPane.setText("<html><head><style type='text/css'>"
            + "body{white-space:nowrap;}"
            + "</style></head><body>");

    JScrollPane scrollPane = new JScrollPane(textPane);
    scrollPane.setHorizontalScrollBarPolicy(
        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    //Remove: textPanel.add(textPane);
    textPanel.add(scrollPane);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

HTML CSS 移除了换行。仍然具有水平滚动条。 此外,您可能可以使用EXIT_ON_CLOSE,尤其是在 IDE 中运行时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多