GUI プログラミング 第 1 演習 HelloWorld ※GUI:Graphical User Interface Java の特徴 1.マルチプラットフォーム 2.オブジェクト指向 3.ガベージコレクション 4.パッケージシステム Java 開発環境「Eclipse」の設定 1.Eclipse の実行 ・共有フォルダから eclipse.zip をコピーして自分の PC の D ドライブへ貼り付け ・D:¥eclipse.zip を右クリック→ここに解凍 ・D:¥eclipse¥eclipse.exe をダブルクリックして起動 2.workspace を「D:¥workspace」に設定して OK 3.最初のタブは閉じる -1 - 4.jdk の確認 ウィンドウ→設定→Java→インストール済みの JRE jdk1.6.xx が入っていれば OK 入っていなければ、追加ボタン→次へ→Java ホームのディレクトリを指定→完了 (※下記の JRE ホームディレクトリは例です。指示に従ってください。) -2 - 5.java ファイルの文字コードを UTF-8 にする ウィンドウ→設定→一般→コンテンツ・タイプ テキスト→Java ソースファイルで、デフォルト・エンコードに UTF-8 と入力→更新 6.行番号の表示 ウィンドウ→設定→一般→エディタ→テキストエディタを選択 右側の設定項目の中で、 「行番号の表示」にチェックをいれて OK -3 - HelloWorldSample まずは、クラスの理解のためコマンドラインのサンプルを作成し、実行してみる。 1.プロジェクトを新規作成 パッケージ・エクスプローラで右クリック→Java プロジェクト プロジェクト名 HelloWorld、JRE は「デフォルト JRE の使用」を選ぶ 2.パッケージの作成 src フォルダを選択→右クリック→新規→パッケージ パッケージ名 helloworld 3.クラスを作る helloworld パッケージを右クリック→新規→クラス 1.Messenger クラス(メッセージを管理するクラス、Messenger.java を参照) メンバー:String message メソッド:get メッセージ、set メッセージ、say メッセージ 2種類のコンストラクタ 2.HelloWorldSample クラス(HelloWorldSample.java を参照) 実行するための main メソッドをもつ。 java の実行メソッドは必ず public static void main(String[] args) 4.実行する 実行ボタンをクリックしてコンソールへの出力を確認 出力結果:Hello World! this is messenger2. (setMessageメソッドを使用) this is messenger3. (コンストラクタその2を使用) Hello World! -4 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 Messenger.java package helloworld; public class Messenger { private String message; public static final String HELLO_WORLD = "Hello World!"; /** * コンストラクタその1 */ public Messenger() { message = HELLO_WORLD; } /** * コンストラクタその2<br> * メッセージを指定する * @param message */ public Messenger(String message) { this.message = message; } /** * message の getter * @return */ public String getMessage() { return message; } /** * message の setter * @param message */ public void setMessage(String message) { this.message = message; } /** * メッセージを標準出力 */ public void sayMessage() { System.out.println(message); } } -5 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 HelloWorldSample.java package helloworld; public class HelloWorldSample { public static void main(String[] args) { Messenger messenger1 = new Messenger(); Messenger messenger2 = new Messenger(); messenger2.setMessage("this is messenger2. (setMessage メソッドを使用)"); Messenger messenger3 = new Messenger("this is messenger3. (コンストラクタその2を使用)"); // メッセージを出力 messenger1.sayMessage(); messenger2.sayMessage(); messenger3.sayMessage(); System.out.println(Messenger.HELLO_WORLD); // 定数へのアクセス } } -6 - GUI 版 HelloWorld サンプル 本講義では、Eclipse に Jigloo GUI Builder というプラグインを適用して Swing プログラムを作成す る。 ※Swing:Java による GUI の構築用ツールの一つ。ほかに、AWT, SWT などがある。Swing は Java プログラム上で描画される軽量コンポーネントで、Pure Java(全て Java)である。近年見 た目や速度に改善がすすんでいる。 AWT…Swing より古い、重量コンポーネント(描画処理が OS に依存する) SWT…Eclipse を開発するために作られた。一部 C や C++で書かれている。 1.フレームを作成 helloworld パッケージを選択→右クリック→新規→その他を選択 GUI Forms→Swing→JFrame を選んで「次へ」 Class Name は HelloWorldFrame として「完了」 2.Jigloo のメッセージが出てきたら「OK」 3.Look&Feel(プログラムの見た目)を設定 フレームを選択→右クリック→Set Look&Feel→Windows または Metal を選択 4.レイアウトを設定 フレームを選択→右クリック→Set Layout→Absolute layout を選択(オブジェクトを座標で指定) 5."Hello World!" の文字列を表示するラベルの作成 上部メニューComponents から Label を選び、フレーム内に貼り付ける 名前:messageLabel テキスト:適当な文字列(GUI で見たときに消えてしまわないため。後で書き換えるのでなんでも よい。 ) フォント:GUI Properties タブの Properties→Basic→font でフォントサイズを 26 にしておく ラベルの大きさ:十分大きくしておく(特に右側) 6.ボタンを2つ作成 jButton1 のテキストは「変更」 、jButton2 のテキストは「元に戻す」とする 7.ボタンを押したときに実行されるメソッドのひな形を作成 ボタンを選択し、右下の Event Name のリスト中の ActionListner を開いて actionPerformed を inline に設定する。2つのボタンの両方に行っておく。 -7 - 8.Source 編集ウィンドウでソースを編集する ・Messenger messenger1,messenger2 を宣言 ・messageLabel のテキストを設定 ・Button の actionperformed メソッドの記述 public class HelloWorldFrame extends javax.swing.JFrame { private Messenger messenger, messenger2; ・・・・ public HelloWorldFrame() { super(); messenger = new Messenger(); messenger2 = new Messenger("Message has changed."); initGUI(); } ・・・・ messageLabel.setBounds(・・・・・・); messageLabel.setText(messenger.getMessage()); ・・・・ jButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { messageLabel.setText(messenger2.getMessage()); } }); ・・・・ jButton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { messageLabel.setText(messenger.getMessage()); } }); 9.実行する -8 - 【発展課題】 各コンポーネントの大きさと配置を、フレームの大きさに合わせて自動設定するように書き換える。 ラベルのテキストのフォントも自動的にフレームぎりぎりになるように調節する。 HelloWorldFrame.java を参考に以下の手順で実装し、空欄になっているところは考えて埋めなさい。 1.GUIEditor で Frame 全体を選択し、右下の Event Name のリスト中の ComponentListner を開 いて componentResized を handler method に設定 2.自動生成されたメッセージハンドラー thisComponentResized の実装 ボタンの配置を計算して実装(ア~ケを埋める) jButton1.setBounds(x 座標,y 座標,幅,高さ); jButton2.setBounds(x 座標,y 座標,幅,高さ); 使うもの:frame.getWidth(), frame.getHeight(), insets.top←タイトルバー高さ frame.getWidth() insets.top 10→ frame.getHeight() 26 10→ 10→ 80 90 180 中央に配置 3.setPrefferedMessageSize(JFrame frame)の実装 ラベルがフレームに比べて小さかったらフォントを大きくしていき、 ラベルがフレームに比べて大きかったらフォントを小さくしていく。 それぞれ、フォントサイズを変更するときの条件にある空欄サ~セおよび□を埋める。 □には論理演算子&&または||のどちらかが入る。 4.Button の actionperformed メソッドを修正 setPreferredMessageSize(frame)を呼び出して、メッセージが変わった時もフォントが調節される ようにする。 -9 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 HelloWorldFrame.java package helloworld; import helloworld.Messenger; import import import import import import import import import import import import java.awt.Dimension; java.awt.Font; java.awt.Insets; java.awt.event.ActionEvent; java.awt.event.ActionListener; java.awt.event.ComponentAdapter; java.awt.event.ComponentEvent; javax.swing.BorderFactory; javax.swing.JButton; javax.swing.JComponent; javax.swing.JFrame; javax.swing.JLabel; import javax.swing.WindowConstants; import javax.swing.border.LineBorder; import javax.swing.SwingUtilities; /** * This code was edited or generated using CloudGarden's Jigloo * SWT/Swing GUI Builder, which is free for non-commercial * use. If Jigloo is being used commercially (ie, by a corporation, * company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. * Please visit www.cloudgarden.com for details. * Use of Jigloo implies acceptance of these licensing terms. * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE. * * 課題 * 文字を常に画面いっぱいにする */ public class HelloWorldFrame extends javax.swing.JFrame { private Messenger messenger, messenger2; private JLabel messageLabel; private JButton jButton1; private JButton jButton2; final int minWidth = 200; final int minHeight = 130; { //Set Look & Feel try { javax.swing.UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); } catch(Exception e) { e.printStackTrace(); } } /** * Auto-generated main method to display this JFrame */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { HelloWorldFrame inst = new HelloWorldFrame(); inst.setLocationRelativeTo(null); -10 - 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 HelloWorldFrame.java inst.setVisible(true); } }); } public HelloWorldFrame() { super(); messenger = new Messenger(); messenger2 = new Messenger("Message has changed."); initGUI(); } private void initGUI() { try { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); getContentPane().setLayout(null); // フレームの最小幅、最小高さを設定 this.setMinimumSize(new Dimension(minWidth, minHeight)); // フレームのサイズ変更イベントを受け取る this.addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent evt) { thisComponentResized(evt); } }); { messageLabel = new JLabel(); getContentPane().add(messageLabel, "Center"); messageLabel.setFont(new java.awt.Font("Dialog",1,26)); messageLabel.setText(Messenger.HELLO_WORLD); } { jButton1 = new JButton(); getContentPane().add(jButton1, "North"); jButton1.setText("変更"); jButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { messageLabel.setText(messenger2.getMessage()); // イベントの原因となったボタンを取得 JButton btn = (JButton)evt.getSource(); // ボタンの親フレームを取得 JFrame frame = (JFrame)SwingUtilities.getWindowAncestor(btn); // ラベルのフォントを修正 setPreferredMessageSize(frame); } }); } { jButton2 = new JButton(); getContentPane().add(jButton2); jButton2.setText("元に戻す"); jButton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { messageLabel.setText(messenger.getMessage()); // イベントの原因となったボタンを取得 JButton btn = (JButton)evt.getSource(); // ボタンの親フレームを取得 JFrame frame = (JFrame)SwingUtilities.getWindowAncestor(btn); // ラベルのフォントを修正 setPreferredMessageSize(frame); } }); } pack(); setSize(400, 300); -11 - 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 HelloWorldFrame.java } catch (Exception e) { e.printStackTrace(); } } private void thisComponentResized(ComponentEvent evt) { // フレームを取得 JFrame frame = (JFrame)evt.getSource(); // タイトルバーの高さを取得するために Insets インスタンス(オブジェクト)を取得 Insets insets = frame.getInsets(); // ボタンの配置 jButton1.setBounds([ ア ], [ イ ], [ ウ ], [ エ ]); jButton2.setBounds([ カ ], [ キ ], [ ク ], [ ケ ]); // Label の配置 setPreferredMessageSize(frame); } private void setPreferredMessageSize(JFrame frame) { Insets insets = frame.getInsets(); // ラベルの大きさを取得 Dimension d = messageLabel.getPreferredSize(); // ラベルのフォントを取得 Font font = messageLabel.getFont(); // フォントサイズを取得 int fontSize = font.getSize(); int i=0; // ラベルがフレームに比べて小さかったらフォントを大きくしていく while ([ サ ]-20 > d.width □ [ シ ]-insets.top-10-56 > d.height) { fontSize ++; messageLabel.setFont(new Font(font.getFamily(), font.getStyle(), fontSize)); d = messageLabel.getPreferredSize(); // ラベルの大きさを計算しなおす messageLabel.setBounds(10, 10, d.width, d.height); if (++i>100) break; } // ラベルがフレームに比べて大きかったらフォントを小さくしていく i=0; while ([ ス ]-20 < d.width □ [ セ ]-insets.top-10-56 < d.height) { fontSize --; messageLabel.setFont(new Font(font.getFamily(), font.getStyle(), fontSize)); d = messageLabel.getPreferredSize(); // ラベルの大きさを計算しなおす messageLabel.setBounds(10, 10, d.width, d.height); if (++i>100) break; } } } -12 -
© Copyright 2024 Paperzz