0

したがって、この質問に関して追加の問題があります

修正を適用したら、メモ帳に移動し、いくつかのランダムな文字を使用して一連のタブと改行を入力し、それらをプログラムに貼り付けます。すべて桃色に動作します。

ただし、タブと改行の束で最も近いテキストであるため、コード自体の一部を JTextArea に貼り付けてみました。すべてのタブと改行がそこにスタックし、除外されませんでした。

私のユーザーはおそらくEclipseコードを私のプログラムに貼り付けませんが、Eclipseコードが唯一の例外であるとは確信できません。だから、どうしてこうなったのか知りたい。

また、コードでスペース文字以外の空白文字を除外し、それらをスペース文字に変換したいと考えています。タブと改行だけだと思いますが、他にもあれば教えてください。

とにかく、それを機能させるには何を変更する必要がありますか?

修正された 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 と改行は除外されません。

4

1 に答える 1

1

replaceメソッドの部分elseでは、「\n」のみを置き換え、「\t」は置き換えません。

于 2013-01-25T17:29:10.423 に答える