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

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

JTextFieldは、Swingアプリケーションにおいてユーザーにテキストを1行形式で入力させるための、最も重要なコンポーネントの一つです。フォームや検索ボックスなど、さまざまな場面で利用されますが、場合によっては「入力できる文字数に上限を設けたい」という要件が発生します。

このような文字数制限は、PlainDocumentクラスを継承したカスタムドキュメントを作成することで簡単に実現できます。ドキュメントはJTextFieldの内部でテキストデータを管理する役割を持つため、ここで挿入処理を制御すれば、上限を超える文字入力を防ぐことが可能です。

実装のポイント

PlainDocumentを継承したクラスでは、insertString()メソッドをオーバーライドします。このメソッドはテキストが挿入される際に必ず呼び出されるため、現在の文字数と挿入しようとする文字数の合計が上限以内であるかを判定し、条件を満たす場合のみ親クラスのinsertString()を呼び出すようにします。

サンプルコード

以下の例では、最大10文字までしか入力できないJTextFieldを実装しています。10文字を超えて入力しようとしても、それ以上の文字は受け付けられません。

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

class JTextFieldLimit extends PlainDocument {
    private int limit;

    JTextFieldLimit(int limit) {
        super();
        this.limit = limit;
    }

    JTextFieldLimit(int limit, boolean upper) {
        super();
        this.limit = limit;
    }

    public void insertString(int offset, String str, AttributeSet attr)
            throws BadLocationException {
        if (str == null)
            return;
        if ((getLength() + str.length()) <= limit) {
            super.insertString(offset, str, attr);
        }
    }
}

public class JTextFieldLimitTest extends JFrame {
    JTextField textfield;
    JLabel label;

    public static void main(String[] args) {
        new JTextFieldLimitTest().GUI();
    }

    public void GUI() {
        setLayout(new FlowLayout());
        label = new JLabel("max 10 chars");
        textfield = new JTextField(15);
        add(label);
        add(textfield);
        // カスタムドキュメントを設定して文字数を制限
        textfield.setDocument(new JTextFieldLimit(10));
        setSize(350, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}

コードの解説

  • JTextFieldLimitクラス:PlainDocumentを継承し、コンストラクタで上限文字数(limit)を受け取ります。
  • insertString()メソッド:既存の文字数(getLength())と新しく挿入される文字数の合計がlimit以下の場合のみ、テキストを挿入します。これにより、貼り付け(ペースト)操作でも制限が有効になります。
  • JTextFieldLimitTestクラス:JFrame上にラベルとテキストフィールドを配置し、setDocument()メソッドでカスタムドキュメントを適用しています。

実行結果

プログラムを実行すると、テキストフィールドには最大10文字までしか入力できません。11文字目以降を入力しようとしても、画面には何も反映されません。また、クリップボードからの貼り付け時も同様に、上限を超える部分は切り捨てられます。

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

まとめ

JTextFieldの入力文字数を制限したい場合は、PlainDocumentを継承してinsertString()メソッドをオーバーライドするのが定番の手法です。この方法ならキーボード入力だけでなくペースト操作にも対応でき、シンプルなコードで堅牢な入力制御を実現できます。電話番号や郵便番号など、桁数が決まっている入力欄を作成する際にぜひ活用してください。

  1. JavaでJTextAreaに行番号を表示する方法【DocumentListener活用】

    JTextAreaはJTextComponentクラスのサブクラスであり、複数行のテキストを表示したり、ユーザーにテキストを入力させたりできるSwingのテキストコンポーネントです。また、CaretListenerインターフェースを実装することで、キャレット(カーソル)の移動イベントを監視することも可能です。 しかし、JTextAreaはデフォルトでは行番号を表示しません。行番号を表示したい場合は、DocumentListenerインターフェースを使ってドキュメントの変更(文字の挿入・削除など)を検知し、その都度行番号を再描画する仕組みを自前で実装する必要があります。 実装のポイント 行番号

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

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