3

数字だけを受け入れる必要があるJTextAreaがあります。これは私のコードです:

DocumentFilter onlyNumberFilter = new AxisJTextFilter();
    final JTextArea areaTextoXMin = new JTextArea(String.valueOf(xMin));
    ((AbstractDocument)areaTextoXMin.getDocument()).setDocumentFilter(onlyNumberFilter);

正の数では問題なく機能しますが、負の数では機能しません。どうすれば修正できますか?

編集:申し訳ありませんが、AxisJTextFilterはインターネットで見つかりましたが、それを忘れてしまいました。そのコードは次のとおりです。

import javax.swing.text.*;
import java.util.regex.*;

public class AxisJTextFilter extends DocumentFilter
{
    public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException
    {
        StringBuilder sb = new StringBuilder();
        sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
        sb.insert(offset, text);
        if(!containsOnlyNumbers(sb.toString())) return;
        fb.insertString(offset, text, attr);
    }
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException
    {
        StringBuilder sb = new StringBuilder();
        sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
        sb.replace(offset, offset + length, text);
        if(!containsOnlyNumbers(sb.toString())) return;
        fb.replace(offset, length, text, attr);
    }
    public boolean containsOnlyNumbers(String text)
    {
        Pattern pattern = Pattern.compile("\\d*(\\.\\d{0,3})?");
        Matcher matcher = pattern.matcher(text);
        boolean isMatch = matcher.matches();
        return isMatch;
    }
}
4

2 に答える 2

6

正規表現を変更してみてください(検証メソッドcontainsOnlyNumbersで)。

Pattern pattern = Pattern.compile("^[\\-\\+]?\\d+(\\.\\d+)?$");

これは、次の番号を受け入れます。

  • 1234
  • -1234
  • +1234
  • 1234.1234

お役に立てば幸いです

ウディ

于 2011-10-03T08:38:03.383 に答える
1

これは、Udiの優れた投稿へのコメントを目的としていますが、その方法がわかりません。

彼のパターン(d +)には少なくとも1桁が必要だと思いますが、それはdである必要がありますか?0〜N桁を許可します。なぜなら、ユーザーが入力しているとき、「-」は正当な入力だからです。また、小数点の後に数字がない場合は、特に入力中は常に有効です。少なくとも1桁の数字が必要になるか、または対応可能で実用的で、文字列「-」を0として扱うことができるのは、最後(フォーカスを失ったときなど、YMMV)だけです。

そして、これらの種類の正規表現を開発するときは、ユーザーがコピーして貼り付ける可能性があることを忘れないでください。

于 2011-10-04T00:03:37.190 に答える