Java のキー入力制限とフィールド入力制限


ブラウザでダウンロード
addKeyListener と setInputVerifier
addKeyListener でキーイベントを3種類処理可能ですが、
3つとも consume() する事によってキー入力がキャンセルされます。

ユーザーコントロール内に実装すれば、もっとすっきりするとは思いますが、
他のキーコントロールの都合を考えると、外側に全て書いてしまうほうが良いと思います。

また、フォーカスが移動するタイミングでチェックする InputVerifier もあるので、
やはり、フィールド単位で書き込むほうが良いと思います。

あるいは、一つのフィールドに対して外部パッケージに一つのクラスを作成して、
管理しても良いかもしれません。
	//*************************************************
	// 入力制限用クラス
	//*************************************************
	class num1Verifier extends InputVerifier {
		public boolean verify( JComponent target ) {
			JTextField check = (JTextField)target;

			String str = check.getText();
			if ( str.equals("1") ) {
				return true;
			}

			return false;
		}
	}

	//*************************************************
	// テキストフィールド
	//*************************************************
	private boolean chk_TextField = true;
	private JTextField getJTextField() {
		if (jTextField == null) {
			jTextField = new JTextField();
			jTextField.setBounds(new Rectangle(125, 26, 71, 27));
			//*************************************************
			// フォーカス移動時の入力制限
			//*************************************************
			jTextField.setInputVerifier(new num1Verifier());
			//*************************************************
			// キー入力制限
			//*************************************************
			jTextField.addKeyListener(new java.awt.event.KeyAdapter() {
				public void keyPressed(java.awt.event.KeyEvent e) {
					Main.this.chk_TextField = chkTextField( e.getKeyCode() );
					if ( !Main.this.chk_TextField ) {
						e.consume();
					}
				}
			});
			jTextField.addKeyListener(new java.awt.event.KeyAdapter() {
				public void keyReleased(java.awt.event.KeyEvent e) {
					if ( !Main.this.chk_TextField ) {
						e.consume();
					}
				}
			});
			jTextField.addKeyListener(new java.awt.event.KeyAdapter() {
				public void keyTyped(java.awt.event.KeyEvent e) {
					if ( !Main.this.chk_TextField ) {
						e.consume();
					}
				}
			});

		}
		return jTextField;
	}
	//*************************************************
	// キー入力制限
	//*************************************************
	private boolean chkTextField( int keyCode ) {
		// System.out.println( keyCode );
		// BS・LEFT・RIGHT
		if ( keyCode == 8 || keyCode == 0x25 || keyCode == 0x27 ) {
			return true;
		}
		// 入力データ量の制限
		if ( jTextField.getText().length() == 1 ) {
			return false;
		}
		// テンキー
		if ( 96 <= keyCode && keyCode <= 105 ) {
			return true;
		}
		// 0〜9
		if ( 48 <= keyCode && keyCode <= 57 ) {
			return true;
		}
		return false;
	}