选项卡,换行符,DocumentFilters和eclipse文本

时间:2013-01-25 16:55:45

标签: java swing jtextarea documentfilter

所以,关于THIS问题我还有一个问题。

一旦我应用了修复程序,请转到记事本,输出大量标签和带有一些随机字符的换行符,然后将它们粘贴到我的程序中,这一切都很有效。

然而,作为带有一组制表符和换行符的最接近的文本,我尝试将代码本身的一部分粘贴到JTextArea。所有标签和新行都停留在那里,并没有被过滤掉。

虽然我的用户可能不会将eclipse代码粘贴到我的程序中,但我无法确定eclipse代码是唯一的例外。所以我想知道为什么会这样。

另外,我希望我的代码可以过滤除空格字符以外的空白字符并将其转换为空格字符。我认为tab和换行是唯一的,但如果还有,请告诉我。

无论如何,我需要做些什么才能让它发挥作用?

这是固定的SSCCE:

package core;

import java.awt.BorderLayout; import java.awt.Dimension; import java.io.FileNotFoundException; import java.io.IOException;

import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter;

class DefaultDocFilter extends DocumentFilter {
    public void insertString(FilterBypass fb, int offs,String str, AttributeSet a) throws BadLocationException 
    {
        if ((fb.getDocument().getLength() + str.length()) <= 2000)
        {
            str = str.replaceAll("\n", " ");
            str = str.replaceAll("\t", " ");
            fb.insertString(offs, str, a);
        }
        else
        {
            int spaceLeft = 2000 - fb.getDocument().getLength();
            if (spaceLeft <= 0)
                return;

            str = str.substring(0, spaceLeft);
            str = str.replaceAll("\n", " ");
            str = str.replaceAll("\t", " ");

            fb.insertString(offs, str, a);
        }
    }

    public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException 
    {
        if (str.equals("\n") || str.equals("\t"))
        { 
            str = "";
        }
        if ((fb.getDocument().getLength() + str.length() - length) <= 2000)
        {
            str = str.replaceAll("\n", " ");
            str = str.replaceAll("\t", " ");
            fb.replace(offs, length, str, a);
        }
        else
        {
            int spaceLeft = 2000 - fb.getDocument().getLength() + length;
            if (spaceLeft <= 0)
                return;

            fb.replace(offs, length, str.substring(0,spaceLeft).replaceAll("\n", " "), a);
        }
    } }


public class Main {
    public static JFrame mWindow;

    public static void main(String[] args) throws FileNotFoundException, IOException
    {   
        //create main window
        mWindow = new JFrame("title");
        mWindow.setSize(1000, 800);
        mWindow.setMinimumSize(new Dimension(1000, 800));
        mWindow.setLocationRelativeTo(null);
        mWindow.setLayout(new BorderLayout());
        mWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextArea a = new JTextArea();
        AbstractDocument doc = (AbstractDocument) a.getDocument();
        doc.setDocumentFilter(new DefaultDocFilter());
        a.setLineWrap(true);
        a.setWrapStyleWord(true);

        mWindow.add(a);
        mWindow.pack();

        mWindow.setVisible(true);

        mWindow.repaint();
        mWindow.validate();
    } }

它是Java 1.7。创建一个新项目,包核心,文件Main。

文档过滤器是第一个类,它应用于您将看到的JTextArea。你需要的一切都在那个班级里。

编辑:我修复了SSCCE。此外,只有当您尝试粘贴更多符合JTextArea的字符(我将限制设置为2000)时,才会出现此问题。然后tas和换行符不会被过滤掉。

1 个答案:

答案 0 :(得分:1)

replace方法中,在方法的else部分中,您只能替换“\ n”而不是“\ t”