【问题标题】:Tabs, newlines, DocumentFilters and eclipse text制表符、换行符、DocumentFilters 和 Eclipse 文本
【发布时间】:2013-01-25 16:55:44
【问题描述】:

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

应用修复程序后,转到记事本,用一些随机字符输入一堆制表符和换行符,然后将它们粘贴到我的程序中,一切正常。

但是,作为带有一堆制表符和换行符的最接近的文本,我尝试将代码本身的一部分粘贴到 JTextArea。所有选项卡和换行符都卡在那里并且没有被过滤掉。

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

另外,我希望我的代码过滤掉除空格字符之外的空白字符并将它们转换为空格字符。我认为 tab 和 newline 是唯一的,但如果还有更多,请告诉我。

不管怎样,我必须改变什么才能让它工作?

这是固定的 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。新建项目,打包core,文件Main。

文档过滤器是第一个类,它应用于您将看到的 JTextArea。您需要的一切都在该类中。

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

【问题讨论】:

  • 哇,我错过了你的 100 行短代码 sn-ps。 :)
  • 无论如何,我们会比我通常给出的更好... :D 你只需要复制更多的文本,它会编译更长的时间,但是你需要看的一切at 位于短类中的文件顶部。
  • 最好你发布简短的代码,在我们运行它时显示问题。
  • 确实...您只需按文件->新建->确定。然后 JTextAreas 出现,你把所有你想要的都粘贴进去。
  • 将您的整个代码转储到一个问题中并不鼓励其他人回答您的问题。修剪不需要重现问题的任何内容。结帐what an SSCCE is

标签: java swing jtextarea documentfilter


【解决方案1】:

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

【讨论】:

  • 不,没错。尝试更改它并粘贴比 JTextArea 更多的字符。
  • @Karlovsky120 抱歉误读了您的问题。以为您试图将字符数限制为 2000。问题来自您的 else,它不会删除标签。
  • 是的,就是这样。我一直在寻找这个代码半小时,我一直错过它......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2019-11-20
  • 1970-01-01
  • 2018-11-17
  • 2010-12-25
  • 1970-01-01
  • 2015-09-28
相关资源
最近更新 更多