DocumentFilterを使った便利な入力値チェッククラスがあったが、残念ながら整数値限定だったので、複数型に対応させてみた。
public abstract class ValueDocumentFilter extends DocumentFilter { protected abstract void parse(String proposedValue); @Override public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { if(string == null) { return; } else { replace(fb, offset, 0, string, attr); } } @Override public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException { replace(fb, offset, length, "", null); } @Override public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { Document doc = fb.getDocument(); int currentLength = doc.getLength(); String currentContent = doc.getText(0, currentLength); String before = currentContent.substring(0, offset); String after = currentContent.substring(length+offset, currentLength); String newValue = before + (text == null ? "" : text) + after; checkInput(newValue, offset); fb.replace(offset, length, text, attrs); } private void checkInput(String proposedValue, int offset) throws BadLocationException { if(proposedValue.length() > 0) { try{ //newValue = Integer.parseInt(proposedValue); parse(proposedValue); } catch(NumberFormatException e) { throw new BadLocationException(proposedValue, offset); } } } }
使い方は以下の通りです。
JTextField tf = new JTextField(); // 整数に限定する場合 ((AbstractDocument)tf.getDocument()).setDocumentFilter( new ValueDocumentFilter() { protected void parse(String proposedValue) { Integer.parseInt(proposedValue); } } ); // 実数に限定する場合 ((AbstractDocument)tf.getDocument()).setDocumentFilter( new ValueDocumentFilter() { protected void parse(String proposedValue) { Double.parseDouble(proposedValue); } } );
下記サイトを参考にさせて頂きました。
有難うございました。
http://terai.xrea.jp/Swing/NumericTextField.html