テキスト入力

テキストフィールドから入力

実行中にユーザーから文字列データを受け取る方法と、グリッドレイアウトを勉強します。

CatText.javaを作る

ユーザーから文字列データを受け取るために,JTextFieldを使います。2つのJTextFieldと1つのJLabel、1つのJButtonを作って配置します。

ファイル名 CatText.java

/**
 *  入力された文字列を連結する
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class CatText extends JFrame implements ActionListener{
    JTextField text1;
    JTextField text2;
    JLabel label;
    JButton button;
    /* コンストラクタ */
    public CatText(){
        setDefaultCloseOperation(EXIT_ON_CLOSE); //終了処理を追加
        text1 = new JTextField(10);
        text2 = new JTextField(10);
        label = new JLabel("");
        button = new JButton("連結"); 

        setLayout(new GridLayout(4,1,0,0));
        add(text1);
        add(text2);
        add(label);
        add(button);
        
        button.addActionListener(this);
        pack();
        setVisible(true);
    }
    /* イベントがあったらここに来る */
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button) {
            label.setText( text1.getText() + text2.getText() );
        }
    }
    /********* main **********/
    public static void main(String[] args){
        /* フレームを作成(事実上のプログラム実行) */
        CatText frame1 = new CatText();
    }
}

レイアウトマネージャ

ボーダーレイアウトは3段までなので,グリッドレイアウトというレイアウトマネージャにします。

ボーダーレイアウトの時

setLayout(new BorderLayout());

  ↓

setLayout(new GridLayout(4,1,0,0));

グリッドは縦横の升目をつくりその中に順に入れていくレイアウトです。(  )の中は次のような意味です。

GridLayout(行数(y),列数(x),左右の隙間,上下の隙間));

上から順に入れていくのでaddには位置の指定が不要になります。

アクションリスナー

つぎはaddActionListenerへの登録です。今回はボタン1つだけです。

button.addActionListener(this);

イベント処理

次はクリックされたときの動作を決める部分actionPerformed()です。やはりボタンひとつだけになります。

if (e.getSource() == button) {
    label.setText( text1.getText() + text2.getText() );
}

処理の内容は

text1.getText()    text1に現在表示されている文字列を取り込んで
text2.getText()    text2に現在表示されている文字列を取り込んで
+   連結して、
label.setText( );  labelの文字列として設定する。

参考

pack()を加えると,そのときの内容にウインドウの大きさを合わせます。文字列を連結して長くなっても,はみ出すことが無くなります。

if (e.getSource() == button) {
    label.setText( text1.getText() + text2.getText() );
    pack();
}

課題

1

上記プログラムをつくりなさい。

ファイル名 CatText.java

2

次のような変更を加え,連結の代わりに足し算をするようにしなさい。

ファイル名 CatText2.java

プログラム中の4カ所にあるCatTextをCatText2に変えます

連結を合計にします。

イベント処理を変更

if (e.getSource() == button) {
      double x,y;
      x = Double.parseDouble(text1.getText());
      y = Double.parseDouble(text2.getText());
      label.setText( Double.toString( x + y ) );
}

x,y にわざわざ代入する必要はないのですが、見やすさのためにこうしました。

処理の内容は

text1 text2 の文字列を数値(double)に変換し、x y にそれぞれ代入

x = Double.parseDouble(text1.getText());
y = Double.parseDouble(text2.getText());

x y の和を求め、文字列に変換

Double.toString( x + y )

それをlabelの文字列として設定する。

label.setText( Double.toString( x + y ) );

右揃え

数値なので右側に揃えたいですね。ラベルはnewでオブジェクトを作るときに、次のようにします。

label = new JLabel("",JLabel.RIGHT);

テキストフィールドはオブジェクトを作ってからsetHorizontalAlignment()で指定します。text1,text2のオブジェクトを作った後に次の2行を加えます。

text1.setHorizontalAlignment(JTextField.RIGHT);
text2.setHorizontalAlignment(JTextField.RIGHT);

エラー処理

数字以外の文字を入力したり、小数点を2つ使ったりすると、エラーが起きて端末にメッセージが出ます。計算の結果は前の計算の値がそのまま残ります。自分で使うだけならこれでもいいのですが、他人に使ってもらうプログラムだとどこが違うかを知らせたり、とりあえず計算結果が出せないことを伝えなければなりません。このような仕事をエラー処理といいます。今回はここまでは考えないことにします。


Javaプログラミング(Feb.2009)
聖愛中学高等学校
http://www.seiai.ed.jp/
Nov.2010加筆