JEditorPane - 将制表符转换为空格

3
我想知道在jeditorpane中是否有一种方法可以将制表符转换为空格,就像在IDE中工作时看到的那样。我不想设置制表符大小,这很容易实现。我想用它们相当于空格替换制表符。因此,例如,如果我的制表符长度为5个空格,则每次创建制表符时都会立即用5个空格替换所有制表符。有什么想法吗?
1个回答

6
DocumentFilter添加到AbstractDocument中,以便在将文本插入Document时用空格替换制表符。
阅读Swing教程中有关文本组件功能的章节以获取更多信息。
简单示例:
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class TabToSpaceFilter extends DocumentFilter
{
    @Override
    public void insertString(FilterBypass fb, int offset, String text, AttributeSet attributes)
        throws BadLocationException
    {
        replace(fb, offset, 0, text, attributes);
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attributes)
        throws BadLocationException
    {
        //  In case someone tries to clear the Document by using setText(null)

        if (text == null)
            text = "";

        super.replace(fb, offset, length, text.replace("\t", "    "), attributes);
    }

    private static void createAndShowGUI()
    {
        JTextArea textArea = new JTextArea(5, 20);
        AbstractDocument doc = (AbstractDocument) textArea.getDocument();
        doc.setDocumentFilter( new TabToSpaceFilter() );

        JFrame frame = new JFrame("Integer Filter");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout( new java.awt.GridBagLayout() );
        frame.add( new JScrollPane(textArea) );
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
    }

}

2
您还可以设置自己的文档,将所有制表符转换为空格。请参阅http://java.sun.com/javase/6/docs/api/javax/swing/text/JTextComponent.html#setDocument%28javax.swing.text.Document%29。 - Istao
1
你可以使用自定义文档,但首选方法是使用DocumentFilter。过滤器可用于任何AbstractDocument,因此代码更可重用,因此可以在JTextArea或JTextPane上使用。 - camickr
1
是的,我最终使用了一个 DocumentFilter。就像 camickr 所说的那样,一旦我将其全部设置好,我就可以轻松地复制另一个文本字段的行为,只要它扩展了 AbstractDocument。 - Cam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接