Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaでJPasswordFieldの入力桁数を制限する方法(DocumentFilter活用)

JPasswordFieldとは

JPasswordFieldJTextFieldのサブクラスで、ユーザーが入力した各文字をエコー文字(通常は「*」)に置き換えて表示するSwingコンポーネントです。この仕組みにより、パスワードやPINコードといった機密情報を画面上に露出させることなく安全に入力できます。代表的なメソッドとしては、getPassword()getText()getAccessibleContext()などが挙げられます。

デフォルトでは、JPasswordFieldには任意の文字数を入力できてしまいます。しかし実際のアプリケーション開発では、「PINコードは4桁まで」のように入力桁数を制限したいケースが多く存在します。こうした要件は、DocumentFilterクラスを実装し、replace()メソッドをオーバーライドすることで簡単に実現できます。

replace()メソッドの構文

public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException

実装例:4桁のPINコード入力フォーム

以下のサンプルコードでは、JPasswordFieldに対してDocumentFilterを設定し、入力を4文字までに制限しています。5文字目以降を入力しようとしても、フィルタによって自動的に無視されます。

import java.awt.FlowLayout;
import javax.swing.*;
import javax.swing.text.*;

public class JPasswordFieldDigitLimitTest extends JFrame {
    private JPasswordField passwordField;
    private JPanel panel;

    public JPasswordFieldDigitLimitTest() {
        panel = new JPanel();
        ((FlowLayout) panel.getLayout()).setHgap(2);
        panel.add(new JLabel("Enter Pin: "));

        passwordField = new JPasswordField(4);
        PlainDocument document = (PlainDocument) passwordField.getDocument();
        document.setDocumentFilter(new DocumentFilter() {
            @Override
            public void replace(DocumentFilter.FilterBypass fb, int offset,
                    int length, String text, AttributeSet attrs)
                    throws BadLocationException {
                String string = fb.getDocument().getText(0, fb.getDocument().getLength()) + text;
                // 合計が4文字以内の場合のみ入力を許可
                if (string.length() <= 4) {
                    super.replace(fb, offset, length, text, attrs);
                }
            }
        });

        panel.add(passwordField);
        add(panel);
        setSize(400, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        new JPasswordFieldDigitLimitTest();
    }
}

コードのポイント

  • passwordField.getDocument()でドキュメントを取得し、setDocumentFilter()を使ってカスタムフィルタを設定します。
  • replace()メソッド内では、まず既存のテキスト全体に新しく入力された文字列を連結し、その合計長が4文字以下である場合にのみsuper.replace()を呼び出します。
  • 条件を満たさない入力は単純に無視されるため、ユーザーは指定桁数以上の文字を入力できなくなります。

なお、貼り付け(ペースト)操作による大量テキスト挿入もreplace()経由で処理されるため、この方法ならキーボード入力だけでなくクリップボードからの貼り付けにも対応できます。より厳密に制御したい場合は、insertString()remove()も併せてオーバーライドするとよいでしょう。

実行結果

プログラムを実行すると、PINコード入力欄が表示され、4文字を超えて入力しようとしてもそれ以上文字が反映されないことが確認できます。

JavaでJPasswordFieldの入力桁数を制限する方法(DocumentFilter活用)
  1. Javaでカウンタープログラムを実装する方法をわかりやすく解説

    この記事では、JavaのSwingを使ってシンプルなカウンター(数を数える)アプリケーションを実装する方法を解説します。このプログラムでは、JLabelでカウント用のラベルを表示し、JTextFieldで現在のカウント値を保持し、JButtonで「追加(Add)」「削除(Remove)」「リセット(Reset)」の3つのボタンを作成します。 「Add」ボタンをクリックするとJTextField内のカウントが1ずつ増加し、「Remove」ボタンをクリックすると1ずつ減少します。さらに「Reset」ボタンをクリックすると、カウントは0にリセットされます。 実装例 import java.awt.*

  2. JavaでJTextFieldに入力できる文字数を制限する方法(PlainDocument活用)

    JTextFieldは、Swingアプリケーションにおいてユーザーにテキストを1行形式で入力させるための、最も重要なコンポーネントの一つです。フォームや検索ボックスなど、さまざまな場面で利用されますが、場合によっては「入力できる文字数に上限を設けたい」という要件が発生します。このような文字数制限は、PlainDocumentクラスを継承したカスタムドキュメントを作成することで簡単に実現できます。ドキュメントはJTextFieldの内部でテキストデータを管理する役割を持つため、ここで挿入処理を制御すれば、上限を超える文字入力を防ぐことが可能です。実装のポイントPlainDocumentを継承した