HelloWorld - Infty Project

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 -