1

セミコロンで区切られた int のリストである独自の DocumentFormat を作成しました。文字列の解析などはうまくいきますが、テキスト全体を新しい文字列に置き換えたいときに問題が発生します。

Invalid removeを呼び出すと例外が発生しsuper.replace(fb, 0, out.length(), out, attrs);ます。誰でもこのメッセージを説明できますか?

ここに私のクラスコードがあります:

import java.util.ArrayList;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;

public class IntsFilter extends DocumentFilter {

        @Override
       public void insertString(FilterBypass fb, int offset, String string,
             AttributeSet attr) throws BadLocationException {
            // Do nothing so far
       }

       @Override
       public void replace(FilterBypass fb, int offset, int length, String text,
             AttributeSet attrs) throws BadLocationException {

           Boolean test = false;

           try {
               Integer.parseInt(text);
               test = true;
           } catch (NumberFormatException e) {
               test = text.equals(";");
           }

            if (!test) return;

            Document doc = fb.getDocument();
            StringBuilder sb = new StringBuilder();
            sb.append(doc.getText(0, doc.getLength()));
            sb.replace(offset, offset + length, text);

            ArrayList<String> data = toArray(sb.toString());
            System.out.println(arrayToString(data));
            String out = arrayToString(data);

            try {
                super.replace(fb, 0, out.length(), out, attrs);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }

       }

       @Override
       public void remove(FilterBypass fb, int offset, int length)
             throws BadLocationException {

           try {
               super.remove(fb, offset, length);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
          // TODO: uzupełnić

       }

       protected String arrayToString(ArrayList<String> input) {

           String result = "";

           for (int i=0; i<input.size(); i++) {

               if (i == input.size() - 1)
                   result += input.get(i).equals("0") ? "" : input.get(i);
               else
                   result += input.get(i) + "; ";

           }

           return result;

       }

       protected ArrayList<String> toArray(String input) {

           input = input.replaceAll(";$", "; 0");

           ArrayList<String> list = new ArrayList<String>();

           for (String part : input.replaceAll("\\s", "").split(";")) {
               try {
                   Integer.parseInt(part);
                   list.add(part);
               } catch (NumberFormatException e) {}
           }

           return list;

       }

}
4

1 に答える 1

2

このエラーは、オフセット + 長さがドキュメントの現在の長さより大きい場合に発生します。自分で交換しないでください。スーパークラスに任せましょう。super.replace() 呼び出しをテスト後に移動します。

于 2013-01-07T21:12:50.043 に答える