数字だけを受け入れる必要がある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;
}
}