Swing/NumericTextField のバックアップソース(No.12)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/NumericTextField へ行く。
- 1 (2008-06-09 (月) 10:55:29)
- 2 (2008-06-09 (月) 12:18:21)
- 3 (2008-06-16 (月) 17:16:40)
- 4 (2009-10-02 (金) 18:57:21)
- 5 (2010-03-06 (土) 03:24:52)
- 6 (2010-03-06 (土) 23:23:56)
- 7 (2010-03-08 (月) 12:38:05)
- 8 (2010-03-08 (月) 13:43:32)
- 9 (2010-03-09 (火) 15:53:23)
- 10 (2010-12-02 (木) 14:19:05)
- 11 (2012-05-17 (木) 11:00:13)
- 12 (2012-06-12 (火) 18:41:57)
- 13 (2013-01-20 (日) 23:50:19)
- 14 (2013-09-28 (土) 21:38:32)
- 15 (2014-12-02 (火) 16:08:56)
- 16 (2014-12-14 (日) 14:42:23)
- 17 (2015-03-17 (火) 15:12:58)
- 18 (2015-03-20 (金) 15:22:46)
- 19 (2015-03-25 (水) 16:54:55)
- 20 (2015-03-28 (土) 15:53:49)
- 21 (2016-05-27 (金) 16:06:37)
- 22 (2017-04-04 (火) 14:17:08)
- 23 (2017-08-29 (火) 16:13:35)
- 24 (2018-09-14 (金) 20:10:41)
- 25 (2020-09-15 (火) 21:28:47)
- 26 (2022-03-30 (水) 18:43:13)
TITLE:JTextFieldの入力を数値に制限する #navi(../) RIGHT:Posted by &author(aterai); at 2008-06-09 *JTextFieldの入力を数値に制限する [#da351c31] JTextFieldへの入力を数値のみに制限します。ソースコードは、[http://java.sun.com/developer/JDCTechTips/2005/tt0518.html Validating Text and Filtering Documents and Accessibility and the Java Access Bridge Tech Tips]からの引用です。 -&jnlp; -&jar; -&zip; //#screenshot #ref(http://lh6.ggpht.com/_9Z4BYR88imo/TQTQjTks6aI/AAAAAAAAAfw/VCCb81SSh1s/s800/NumericTextField.png) **サンプルコード [#e7b4eac7] #code{{ JTextField textField1 = new JTextField("1000"); textField1.setHorizontalAlignment(JTextField.RIGHT); textField1.setInputVerifier(new IntegerInputVerifier()); JTextField textField2 = new JTextField(); textField2.setDocument(new IntegerDocument()); textField2.setText("2000"); JTextField textField3 = new JTextField(); ((AbstractDocument)textField3.getDocument()).setDocumentFilter(new IntegerDocumentFilter()); textField3.setText("3000"); JFormattedTextField textField4 = new JFormattedTextField(); textField4.setFormatterFactory(new NumberFormatterFactory()); textField4.setHorizontalAlignment(JTextField.RIGHT); textField4.setValue(4000); JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, Integer.MAX_VALUE, 1)); ((JSpinner.NumberEditor)spinner.getEditor()).getFormat().setGroupingUsed(false); spinner.setValue(5000); }} **解説 [#r1c4bc0e] -1:JTextField + InputVerifier --[http://java.sun.com/developer/JDCTechTips/2005/tt0518.html Validating with Input Verifiers] --InputVerifierを継承するIntegerInputVerifierを作成し、これをJComponent#setInputVerifierメソッドで設定しています。 --別コンポーネントにフォーカスが移動するときに、数値かどうか評価します。 --数値以外、または結果が範囲外となる場合、テキストは変化せずbeep音が鳴り、フォーカス移動がキャンセルされます。 #code{{ class IntegerInputVerifier extends InputVerifier{ @Override public boolean verify(JComponent c) { boolean verified = false; JTextField textField = (JTextField)c; try{ Integer.parseInt(textField.getText()); verified = true; }catch(NumberFormatException e) { UIManager.getLookAndFeel().provideErrorFeedback(c); //Toolkit.getDefaultToolkit().beep(); } return verified; } } }} -2:JTextField + Custom Document --[http://java.sun.com/developer/JDCTechTips/2005/tt0518.html Validating with a Custom Document] --PlainDocumentを継承するIntegerDocumentを作成し、これをJTextComponent#setDocumentメソッドで設定しています。 --キー入力、文字列のペーストが行われたときに、数値かどうか評価します。 --入力が数値以外、または結果が範囲外となる場合、beep音が鳴り、テキストは変化しません。 #code{{ class IntegerDocument extends PlainDocument { int currentValue = 0; public IntegerDocument() { super(); } public int getValue() { return currentValue; } @Override public void insertString(int offset, String str, AttributeSet attributes) throws BadLocationException { if(str==null) { return; }else{ String newValue; int length = getLength(); if(length==0) { newValue = str; }else{ String currentContent = getText(0, length); StringBuffer currentBuffer = new StringBuffer(currentContent); currentBuffer.insert(offset, str); newValue = currentBuffer.toString(); } currentValue = checkInput(newValue, offset); super.insertString(offset, str, attributes); } } @Override public void remove(int offset, int length) throws BadLocationException { int currentLength = getLength(); String currentContent = getText(0, currentLength); String before = currentContent.substring(0, offset); String after = currentContent.substring(length+offset, currentLength); String newValue = before + after; currentValue = checkInput(newValue, offset); super.remove(offset, length); } private int checkInput(String proposedValue, int offset) throws BadLocationException { if(proposedValue.length()>0) { try{ int newValue = Integer.parseInt(proposedValue); return newValue; }catch(NumberFormatException e) { throw new BadLocationException(proposedValue, offset); } }else{ return 0; } } } }} -3:JTextField + DocumentFilter --[http://java.sun.com/developer/JDCTechTips/2005/tt0518.html Validating with a Document Filter] --DocumentFilterを継承するIntegerDocumentFilterを作成し、これをAbstractDocument#setDocumentFilterメソッドで設定しています。 --%%別コンポーネントにフォーカスが移動するときに、数値かどうか評価します。%% --キー入力、文字列のペーストが行われたときに、数値かどうか評価します。 --入力が数値以外、または結果が範囲外となる場合、beep音が鳴り、テキストは変化しません。 #code{{ class IntegerDocumentFilter extends DocumentFilter { //int currentValue = 0; @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; //currentValue = checkInput(newValue, offset); fb.replace(offset, length, text, attrs); } private static int checkInput(String proposedValue, int offset) throws BadLocationException { int newValue = 0; if(proposedValue.length() > 0) { try { newValue = Integer.parseInt(proposedValue); }catch(NumberFormatException e) { throw new BadLocationException(proposedValue, offset); } } return newValue; } } }} -4:JFormattedTextField + DefaultFormatterFactory --[http://java.sun.com/docs/books/tutorial/uiswing/components/formattedtextfield.html How to Use Formatted Text Fields] --DefaultFormatterFactoryを継承するNumberFormatterFactoryを作成し、これをJFormattedTextField#setFormatterFactoryメソッドで設定しています。 --別コンポーネントにフォーカスが移動するときに、数値かどうか評価します。 --数値以外の場合、テキストは以前の値にUndoされます。 --数値が範囲外となる場合、最小値、または最大値に調整されます。 ---注:[[SpinnerNumberModelに上限値を超える値を入力>Swing/SpinnerNumberModel]] #code{{ class NumberFormatterFactory extends DefaultFormatterFactory{ private static NumberFormatter numberFormatter = new NumberFormatter(); static{ numberFormatter.setValueClass(Integer.class); ((NumberFormat)numberFormatter.getFormat()).setGroupingUsed(false); } public NumberFormatterFactory() { super(numberFormatter, numberFormatter, numberFormatter); } } }} -5:JSpinner + SpinnerNumberModel --JFormattedTextFieldの場合と同等の動作です。 **参考リンク [#r60440e6] -[http://java.sun.com/developer/JDCTechTips/2005/tt0518.html Validating Text and Filtering Documents and Accessibility and the Java Access Bridge Tech Tips] -[http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html How to Use Formatted Text Fields] -[[JSpinnerで無効な値の入力を許可しない>Swing/NumberFormatter]] **コメント [#yc4c9280] #comment