テキストを入力しよう
テキストフィールド
キー入力によるイベントはわかりましたが
文字列を入力するとなると、キー入力だけでは大変です
ここでは、テキストエディタなどの製作には欠かせないテキストエリアの生成を紹介します
まず、一行入力のフィールドであるテキストフィールドです
これは、Windowsコントロールのインプットボックスに相当します
テキストフィールドの生成にはjava.awt.TextFieldクラスを使用します
このクラスのコンストラクタは次のとおりです
public TextField()
public TextField( String text )
public TextField( int columns )
public TextField( String text, int columns )
textには、表示するテキストを指定します
textが指定されている場合は、テキストフィールドに初期状態から文字が表示されます
columnsは、指定された文字数を表示できるだけのサイズで生成します
テキストフィールドで発生するイベントは同クラスのaddActionListener()メソッドでリスナを登録します
テキストフィールドの場合は、Enterキーを入力するとイベントが発生します
public synchronized void addActionListener( ActionListener lis )
lisにリスナを指定します
ActionListenerはボタンの作成時にやったのでわかりますね
テキストフィールドの内容は、ActionEventクラスのgetActionCommand()メソッドで得られます
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="App35.class" width="300"height="300">
</applet>
*/
public class App35 extends Applet implements ActionListener {
Choice cho;
public void init() {
setBackground(Color.white);
TextField fd = (TextField)add(new TextField(20));
fd.addActionListener(this);
cho = (Choice)add(new Choice());
cho.add("--選択してください--");
}
public void actionPerformed(ActionEvent e) {
cho.add(e.getActionCommand());
}
}
テキストフィールドに文字列を入力してEnterキーを押してください
チョイスにテキストフィールドの文字列が追加されているはずです
テキストエリア
テキストエディタや数行に渡る文字列の入力要求の場合
テキストフィールドよりもテキストエリアが適任です
テキストエリアを作成するにはjava.awt.TextAreaクラスを使用します
コンストラクタは次のとおりです
public TextArea()
public TextArea( String text )
public TextArea( int rows, int columns )
public TextArea( String text, int rows, int columns )
public TextArea( String text, int rows, int columns, int scrollbars )
パラメータに何も指定しない場合は、垂直、水平スクロールバーの付いたテキストエリアを作成します
textを指定した場合、指定された文字列を初期状態で表示します
rowsには行列(縦)、columnsには列数(横)を指定します
scrollbarsを明示的に指定した場合は、スクロールバーを定数にあわせます
これを明示しなかった場合は、垂直、水平のスクロールバーが付きます
スクロールバーを制御する定数は、同クラスに用意されています
public static final int SCROLLBARS_BOTH | 両方のスクロールバー
|
public static final int SCROLLBARS_HORIZONTAL_ONLY | 水平スクロールバー
|
public static final int SCROLLBARS_NONE | 表示しない
|
public static final int SCROLLBARS_VERTICAL_ONLY | 垂直スクロールバー
|
このコンポーネントには、特別用意されたイベントはありません
テキストを挿入するにはinsert()メソッドを使用します
また、getColumns()やgetRows()メソッドで、列数や行数を得られます
public synchronized void insert( String str, int pos )
public int getColumns()
public int getRows()
insert()メソッドのstrには、挿入する文字列を指定します
posには、指定した文字列を挿入するエリアの位置を指定できます
getColumns()は列数、getRows()は行数を返します
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="App36.class" width="300"height="300">
</applet>
*/
public class App36 extends Applet implements ActionListener {
TextArea txt;
public void init() {
setBackground(Color.white);
TextField fd = (TextField)add(new TextField(20));
fd.addActionListener(this);
txt = (TextArea)add(new TextArea(10 , 20));
}
public void actionPerformed(ActionEvent e) {
txt.insert(e.getActionCommand() , 0);
}
}
上のテキストフィールドに文字を入力してEnterキーを押すと、テキストエリアにコピーされます
テキストエリアに直接文字を入力することも、もちろん可能です
スクロールバーが最初からついているか、表示範囲を超えたら自動的に付くかは
プラットフォームやJVMのヴァージョン、種類で異なります
常にテキストを監視する
テキストフィールドやテキストエリアを作る方法はわかりました
しかし、それぞれの入力を完全に監視する方法はまだ紹介していませんでしたね
入力ごとにイベントを監視したり、直接入力されているテキストを得るには
TextFieldクラスやTextAreaクラスのスーパークラスであるjava.awt.TextComponentクラス を知る必要があります
TextComponentクラスは、Componentクラスを拡張しています
テキスト関連のクラスのスーパークラスであり、TextAreaなどはこのクラスの機能を継承しています
このクラスにはaddTextListener()メソッドがあります
public synchronized void addTextListener( TextListener lis )
これで、コンポーネントからテキストイベントを受け取るリスナを登録できます
ここで渡すjava.awt.event.TextListenerインターフェイスは
テキストの値が変わると呼び出されるtextValueChange()メソッドを宣言しています
public abstract void textValueChanged( TextEvent e )
ここで受け取るのはjava.awt.event.TextEventクラスのオブジェクトです
今は、このクラスの詳細に付いて知る必要はないでしょう(特別なメソッドはない)
テキストコンポーネントの内容を得るには、TextComponentクラスのgetText()を
逆に、内容を設定(追加ではなく上書き)するにはsetText()が有効です
public synchronized String getText()
public synchronized void setText( String t )
getText()は、指定したオブジェクトの内容を返します
setText()の t には、表示する文字列を指定します
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="App37.class" width="300"height="300">
</applet>
*/
public class App37 extends Applet implements TextListener {
TextArea txt[] = new TextArea[2];
public void init() {
setBackground(Color.white);
txt[0] = (TextArea)add(new TextArea(10 , 20));
txt[1] = (TextArea)add(new TextArea(10 , 20));
txt[0].addTextListener(this);
}
public void textValueChanged( TextEvent e ) {
txt[1].setText(txt[0].getText());
}
}
最初のテキストエリア(左側)が書き換えられるとイベントが発生し
txt[1]のテキストエリアに内容がコピーされます
アプリケーションとしてテキストエディタを作成した場合、ファイルを読み込んだり保存する必要があります
そのとき、getText()やsetText()などを使用する必要がありますね