1行テキスト


テキストフィールド

テキストの表示であればラベルコンポーネントで十分ですが
ユーザーに文字列を入力させたい場合はテキスト入力コンポーネントが必要です
入力用のコンポーネントはテキストコンポーネントとして統一されており
javax.swing.text.JTextComponent 抽象クラスとルートにしています
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.text.JTextComponent

public abstract class JTextComponent
	extends JComponent implements Scrollable, Accessible
コンポーネントのテキストは JTextComponent.setText() で設定し
取得は JTextComponent.getText() で行うことができます
これらのメソッドはこのクラスでオーバーロード及びオーバーライドされています

public void setText(String t)
public String getText()
public String getText(int offs , int len) throws BadLocationException

t には、テキストとしてコンポーネントに表示する文字列を
offs には取得するテキストの開始位置、len には offs からの長さを指定します
これを指定すれば、部分的にテキスト情報を取得することができます
入力文字数などを制限する場合には便利でしょう

1 行の文字列を入力する簡易入力用のコンポーネントは
javax.swing.JTextField クラスで実装されています
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.text.JTextComponent
                          |
                          +--javax.swing.JTextField

public class JTextField
	extends JTextComponent implements SwingConstants
このクラスは、次のようなコンストラクタを公開しています

public JTextField()
public JTextField(String text)
public JTextField(int columns)
public JTextField(String text , int columns)
public JTextField(Document doc , String text , int columns)

text には初期時に表示する文字列を指定します
columns はフィールドの適切な幅を調整するために使われる列数を指定します
doc にはテキストコンポーネントのモデルとなるドキュメントを指定します
Document クラスについて、詳しくは後ほど解説します

テキストフィールドは、列数を指定することで最適なサイズを指定することができます
列数は、入力するデータ内容に合わせて適切と思える文字数を指定します
これは JTextField.setColumns()メソッドで列数を設定し
JTextField.getColumns() メソッドで現在の列数を得られます

public void setColumns(int columns)
public int getColumns()

columns には列数を指定します
再描画を行えば、フィールドは列数にしたがって最適なサイズで描画されます

テキストの変更は PropertyChangeListener を使って感知することができますが
テキストフィールドコンポーネントはフォーカスを持つ状態で Enter キーを押すと
登録されているアクションリスナを呼び出します
アクションリスナは JTextField.addActionListener() で設定し
JTextField.removeActionListener() メソッドで解除することができます

public void addActionListener(ActionListener l)
public void removeActionListener(ActionListener l)

l には登録、または解除するアクションリスナを設定します
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends JApplet implements ActionListener {
	JTextField text = new JTextField("0");
	public void init() {
		text.addActionListener(this);
		getContentPane().setLayout(new FlowLayout());
		getContentPane().add(text , BorderLayout.NORTH);
	}
	public void actionPerformed(ActionEvent e) {
		int cl = Integer.valueOf(text.getText()).intValue();
		if (cl > 0) text.setColumns(cl);
		getContentPane().validate();
	}
}


このプログラムは、テキストフィールドを持つアプレットを作成します
テキストフィールドに数値を入力し、Enter キーを押すと
その列数を設定し、validate() を呼び出してサイズを変更しています

テキストフィールドのフォントは JTextField.setFont() で設定できます

public void setFont(Font f)

f には新たに設定するフォントを指定します
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet {
	JTextField text = new JTextField("Kitty on your lap");
	public void init() {
		text.setFont(new Font("Serif" , Font.ITALIC , 40));
		getContentPane().setLayout(new FlowLayout());
		getContentPane().add(text , BorderLayout.NORTH);
	}
}


このプログラムは、テキストフィールドに明示的にフォントを指定しています


パスワード

ネット関連の機能や、セキュリティ機能を持つソフトウェアは
ユーザーがその操作を行う権限を持っているかどうかを調べるために
パスワードの入力を要求することがしばしばあります

しかし、ユーザーが常に一人でいるとは限りません
周囲の人間が、ユーザーがパスワードの入力を行っているところを盗み見た場合
そこからパスワードが漏れたりする可能性があります
もしくは、メモリ上にリークした情報を解析される可能性も指摘されます
セキュリティとは、重要な課題です

そこで、javax.swing.JPasswordField クラスが提供されています
これは JTextField を拡張し、パスワードの入力に特化したコンポーネントです
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.text.JTextComponent
                          |
                          +--javax.swing.JTextField
                                |
                                +--javax.swing.JPasswordField

public class JPasswordField extends JTextField
このクラスのコンストラクタは JTextField クラスと同じシグネチャです
パスワードフィールドは、テキストフィールドとこなりセキュリティが存在します
まず、クリップボードとのやり取りが禁止されます
それに、入力されたデータは String ではなく、原則として char[] で扱います

データが入力されても、テキストフィールドとは異なりそれを表示しません
その代わり、エコーと呼ばれる代わりとなる文字を表示します
エコーを表示した場合、何も表示しない場合に比べてセキュリティが弱まりますが
一般のユーザーは、反応がなければ入力されているのか理解できないため
通常は、入力に対して反応を示すエコーを表示するべきだと考えられています

エコーは JPasswordField.setEchoChar() で設定し
JPasswordField.getEchoChar() メソッドで取得することができます

public void setEchoChar(char c)
public char getEchoChar()

c にはエコー文字を指定します
入力されたパスワードの取得は JPasswordField.getPassword() を使います
getText() メソッドは、セキュリティの問題から使うことは推奨されません
文字配列であれば、情報が不要になれば上書きによってメモリから削除することができます

public char[] getPassword()

このメソッドは、入力された文字列の文字配列を返します
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends JApplet implements ActionListener {
	JPasswordField text = new JPasswordField(20);
	public void init() {
		text.addActionListener(this);
		text.setEchoChar('猫');
		getContentPane().setLayout(new FlowLayout());
		getContentPane().add(text , BorderLayout.NORTH);
	}
	public void actionPerformed(ActionEvent e) {
		char pass[] = text.getPassword();
		JOptionPane.showMessageDialog(this , String.valueOf(pass));
	}
}


このプログラムでは、エコー文字 '猫' を設定し
パスワードフィールドをアプレットに表示しています



前のページへ戻る次のページへ