java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

SwingのJTextField、JTextArea

投稿日:

最終更新日:2017年03月12日

アイキャッチ

こんにちは。

今回はSwingのJTextField、JTextAreaを使ってみました。

これらのクラスはともにテキスト入力してもらうためのコンポーネントです。JTextFieldは1行のテキストを入力するためのコンポーネントで、JTextAreaでは複数行が入力可能です。

以下のプログラムを雛形として使います。

ソース

import javax.swing.JFrame;

public class Test extends JFrame {

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

    public Test() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);

        init();

        setVisible(true);
    }

    private void init() {
        // 設置処理
    }

}

JTextField

設置する

FlowLayoutでJTextFieldオブジェクトを設置しようと思います。コンストラクタはいくつかあります。例えば、以下の2つです。

  • JTextField()
  • JTextField(int columns)

JTextField()を使うと幅のない入力欄が設置されます。今回は、JTextField(int columns)を使います。columnsで入力欄の列数を指定できます。

例えば次のように使います。

ソース

import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class Test2 extends JFrame {

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

    public Test2() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);

        init();

        setVisible(true);
    }

    private void init() {
        setLayout(new FlowLayout());

        JTextField textField = new JTextField(25);
        add(textField);
    }
}

上記プログラムでは幅25でテキストが未入力の入力欄が表示されます。この25という数値なのですが文字数なのか不明でした。「axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa」が入力できましたが、54文字です。

あらかじめ何か入力されている入力欄を作りたい場合は、JTextField(String text)やJTextField(String text, int columns)というコンストラクタがあります。

Enterキーでコンソール出力

addActionListenerメソッドが使えます。API仕様書のメソッドの説明からは読み取れませんでしたが、カーソルが入力欄にあるときにEnterキーを押すとアクション・イベントが発生するようです。仕様書のJTextFieldの説明にVK_ENTERイベントという記述がありますので、おそらくその個所がEnterキー押下時の動作の説明のようです。

例えば次のように使います。

ソース

import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class Test3 extends JFrame {

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

    public Test3() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);

        init();

        setVisible(true);
    }

    private void init() {
        setLayout(new FlowLayout());

        JTextField textField = new JTextField(25);
        add(textField);

        textField.addActionListener(event -> {
            System.out.println(textField.getText());
        });
    }

}

上記プログラムでは、Enterキーを押したときに、入力されているテキストをコンソールに出力しています。入力欄のテキストを取得したい場合、getText()メソッドを使います。このメソッドは未入力のときは空文字を返却します。つまり、長さ0の文字列です。

選択された部分だけ取得したい場合は、getSelectedText()を使います。未選択の場合、このメソッドはnullを返却します。

なお、getText()メソッドとgetSelectedText()メソッドは共にJTextFieldの親クラスJTextComponentのメソッドです。

キャレット

キャレットとは文字列入力のときのカーソルのことを言うのだそうです。JTextFieldの親クラスJTextComponentにはgetCaret()というメソッドがあります。このメソッドはインタフェースCaretを返却します。

Caretに定義されているメソッドでよく使うものは以下だと思います。

int getDot()
キャレットの現在の位置を取り出します。
int getMark()
マークの現在の位置を取り出します。

以下はEnterキーを押下した際に、上記のメソッドの返却値をコンソールに出力する例です。

ソース

import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.Caret;

public class Test4 extends JFrame {

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

    public Test4() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);

        init();

        setVisible(true);
    }

    private void init() {
        setLayout(new FlowLayout());

        JTextField textField = new JTextField(25);
        add(textField);

        textField.addActionListener(event -> {
            Caret caret = textField.getCaret();
            System.out.println(caret.getDot());
            System.out.println(caret.getMark());
        });
    }

}

上記プログラムを動かすと、以下のように動作します。

入力欄 getDot() getMark()
未入力 0 0
「abcde」の「cd」の間にキャレット 3 3
「abcde」の「cd」を左から選択 4 2
「abcde」の「cd」を右から選択 2 4

getDot()がキャレットの位置を表します。文字列を右から選択した場合と、左から選択した場合ではキャレットの位置が違うため、上記のような数値が返却されます。

getMark()は選択範囲がある場合、getDot()とは異なる値になります。選択範囲がある場合は、それを選択したときの最初のキャレットの位置になるようです。

選択領域の色

JTextFieldの親クラスJTextComponentには選択領域の色の取得・設定をするメソッドがあります。以下の2つです。

  • public Color getSelectionColor()
  • public void setSelectionColor(Color c)

getSelectionColor()で調べた結果、選択領域の色の初期値は[r=184,g=207,b=229]です。

選択領域のテキストについては以下の2つのメソッドがあります。

  • public Color getSelectedTextColor()
  • public void setSelectedTextColor(Color c)

getSelectedTextColor()で調べた結果、選択領域のテキストの色は[r=51,g=51,b=51]です。

以下では選択領域とそのテキストの色を設定しています。

ソース

package test0009;

import java.awt.Color;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class Test5 extends JFrame {

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

    public Test5() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);

        init();

        setVisible(true);
    }

    private void init() {
        setLayout(new FlowLayout());

        JTextField textField = new JTextField(25);
        add(textField);

        textField.setSelectionColor(new Color(255, 0, 0));
        textField.setSelectedTextColor(new Color(255, 255, 255));
    }

}

選択領域を赤に設定し、選択領域のテキストを白に設定しています。

JTextArea

設置する

コンストラクタはいくつかありますが、基本はJTextArea(int rows, int columns)だと思います。引数はそれぞれ行数と列数です。

例えば、以下のように使います。

ソース

import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Test6 extends JFrame {

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

    public Test6() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(350, 250);

        init();

        setVisible(true);
    }

    private void init() {
        setLayout(new FlowLayout());

        JTextArea textArea = new JTextArea(10, 20);
        add(textArea);
    }

}

JTextAreaでは複数行を入力することができます。

Enterキーで改行して次の行を入力することができます。

以上、参考になれば幸いです。