こんにちは。
今回は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キーで改行して次の行を入力することができます。
以上、参考になれば幸いです。