←前頁 | 次頁→ |
---|
その8(GUI1)
今度の例題は、GUI入出力のプログラムです。
見所はレイアウトマネージャの使い方です。
JAVAのGUIプログラム時には、レイアウトマネージャを使って
部品を配置します。
GridBagLayoutは、一番汎用性のあるレイアウトマネージャです。
ついでに、日付の文字列の編集方法もよくみておいてね。
今回のプログラムは、Appletではないので、java Caldate で起動して下さい。
ほんとは、JFCという最新のGUI部品を使いたかったん
だけど、私のNoteパソコンではうまく動かなかったので、皆さんでチャレンジ
して下さい。
Frame->JFrame のようにGUI部品のクラス名をJ付きにすれば、おおむね
いけるはずです。
/** 日付の計算 @author 服部建作 @version 1.0 1999/11/09 */ import java.awt.*; import java.awt.event.*; import java.util.*; import java.text.*; public class Caldate extends Frame{ TextField intext, anstext; Button button; //コンストラクタで画面表示部品の配置を行う Caldate(){ //親クラスのコンストラクタで外形を作成 super("日付の計算"); setBackground(new Color( 0xc08080)); //背景色 //ウィンドウのイベント処理を登録 addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e){ System.exit(0); } }); //Grid(格子状)のレイアウトマネージャを使用する GridBagLayout gridbag = new GridBagLayout(); //Gridbagレイアウトの制御にはGridBagConstraintsクラスが必要 GridBagConstraints cons = new GridBagConstraints(); //このフレームの標準フォントを設定 this.setFont(new Font("Serif", Font.PLAIN, 14)); //このフレームにレイアウトマネージャを設定 this.setLayout( gridbag); //ラベルを配置 cons.insets = new Insets(3,3,3,3); //部品の周りの余白をピクセルで指定 cons.anchor = GridBagConstraints.CENTER; //セル内の配置 cons.gridx = 0; cons.gridy = 0; //グリッドのX,Y座標を指定 cons.gridheight = 1; //グリッド上で占める行数 cons.gridwidth = 1; //グリッド上で占める列数 cons.weightx = cons.weighty = 0.0; //空きスペース配分の重み this.add(new Label("今日から"), cons); //テキストボックスを配置 cons.gridx = 1; cons.gridy = 0; //グリッドのX,Y座標を指定 intext = new TextField( "1", 3); this.add( intext, cons); //ラベルを配置 cons.gridx = 2; cons.gridy = 0; //グリッドのX,Y座標を指定 this.add(new Label("日後は"), cons); //テキストボックスを配置 cons.gridx = 3; cons.gridy = 0; //グリッドのX,Y座標を指定 anstext = new TextField( "", 12); this.add( anstext, cons); anstext.setEditable(false); //入力禁止にする anstext.setBackground(new Color( 0xc0c000)); //ラベルを配置 cons.gridx = 4; cons.gridy = 0; //グリッドのX,Y座標を指定 this.add(new Label("です。"), cons); //次の行にボタンを配置 cons.gridx = 3; cons.gridy = 1; cons.gridwidth = 2; //2列分使用する button = new Button("計算実行"); this.add( button, cons); //ボタンにイベントを登録 button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ev){ dispDate(); } }); //フレームの大きさを指定 setSize( 400, 100); //フレーム表示 setVisible(true); } public static void main(String[] args){ //メインはコンストラクタを呼出すだけ Caldate form = new Caldate(); } //指定日後の日付を表示 void dispDate(){ Calendar now = Calendar.getInstance(); //現在日時 anstext.setText(""); //出力欄をクリア String hi = intext.getText(); //入力文字列の取得 //入力がない時は即リターン if( hi.trim().equals("")){ return; } int iday; try{ iday = Integer.parseInt(hi); }catch( NumberFormatException e){ anstext.setText("整数値を指定して下さい"); return; } //日付の計算 now.add(Calendar.DATE, iday); SimpleDateFormat form = new SimpleDateFormat("yyyy年MM月dd日"); anstext.setText(form.format(now.getTime())); } }importについて
GUI部品の配置の仕方
- GUI部品を使うには、java.awt.* と java.awt.event.* の2つをimportする必要があります。
- イベントを使わなければ、java.awt.event.* は不要ですが、クリックイベント等 を使わないことはないので、常にいれて置きます。
- JFCの部品を使用するには、javax.swing.* も importします。
- 日付のフォ-マットSympleDateFormatクラスを使う為に必要です。
- java.util.* は、Date と Calendarクラスを使う為に必要です。
- どのクラスでどのimportが必要かは、JAVA APIドキュメントを参考して下さい。
- GUI部品は、親のFrameにaddメッソドで追加していけばよいだけです。
- JFrameの場合は、内部フレームにaddします。
- (Container cont=this.getContentPane(); cont.add(new JLABEL("後は"));)
- add()メソッドの第2引数は、レイアウトマネージャに指定する値で、 レイアウトマネージャ毎に渡す値や型が異なります。
- (ちなみに、FlowLayoutマネージャでは、add()メソッドは第2引数をとりません。)
GridBagLayoutの使いかた
- GridBagLayoutは、格子状の配置イメージを作成し、しかも各格子の多きさが可変で 新聞の見だしのように2段抜き、3段抜きの配置ができます。
- setLayout()で、newしたGridBagLayoutのオブジェクトをフレームに設定します。
- (このへんは、他のレイアウトマネージャも同様)
- GridBagLayoutはコントロール用に、GridBagConstraintsオブジェクトが必要です。
- GridBagLayout(正確には GridBagConstraints)には設定するプロパティが沢山 あります。
- 基本は、gridx, gridy で配置する位置を指定して add(部品, GridBagConstraints); で設定します。
- weightx, weighty は、少なくとも一つの行と列で0以外にしろと本に書いてあるが 私はよく理解できなかった。
- とりあえず0.0でも動いたのでよしとするが、全部 1.0にして置いた方がよいかもしれない。
日付の扱いかた
- 日付は、Dateクラスというのもありますが、通常は Calendarクラスの方が便利です。
- 日付を整形して出力するのは、C言語のsprintf()にあたる関数がないので ちょっと面倒です。
- SympleDateFormatオブジェクトを作成して、そのformatメソッドで文字列編集します。
- 数値の場合の編集は、NumberFormatやDecimalFormatを使いますが、もっと面倒です。
- (私も判りきってないので、各自APIマニュアルを参考して下さい)
レイアウトマネージャ:
←前頁 次頁→ JFC(Java Foundation Class):
- JAVAでは、部品配置にマネージャというものを使用する。
- 面倒くさいけど、画面の多きさを変更した時に、それなりに再配置 してくれる所が、GOOD。
- FlowLayout:単純にadd()した順に配置
- BorderLayout:東西南北と中央に配置する
- GridLayout:格子状に配置する。GridBagLayoutと違って多きさは同じ。
- CardLayout:タブ付きダイアログのように階層で配置する。
- 以上のレイアウトで気に入らない時は、
- 1.FrameにPanelを配置し、Panelに上記レイアウトを設定する。
- 2.レイアウトマネージャを自作する。(本によると簡単に作れると 書いてある。)
- JAVA1.1.6あたりからOPTIONでついていた、GUIの軽量コンポネントクラス
- JAVA2からは、標準でついてくる。
- 軽量&高機能という謳い文句なので、今後はこちらを使っての開発が主流と なるはず。
- でも、雑誌の評価によると、軽量&スローということのようで今後のバージョンアップが 期待されるところ。
- 私のNoteには、JAVA1.2.2が入っているが、JFCを使ったプログラムを1度 実行すると、2回目はJVM自体がアプリケーションエラーで死んでしまう。
- 会社のマシンだとうまく動くみたいなので、パソコンの環境設定と思われる。
- かなり悩んでいるので、お心当りの方はご一報のほど。