月別アーカイブ: 2014年11月

日付と時間(2)

「日付と時刻」をデータとして扱う方法です.Date クラスのオブジェクトは生成時にその時点の日付&時刻を取得しますが,ここで紹介する Calendar クラスのオブジェクトは日付&時刻を1つのデータと見て日数計算(「〜日あと」とか「〜週間前」,「〜時間後」とかの計算)をするためのものです.
 下のサンプルプログラム “CalendarTest1.java” では最初に「2014/01/01,00:00:00」の日付をデータとして用意して「〜日後」「〜時間後」のような計算をしている例です.
 set() メソッドで日付や時刻を設定し,add() メソッドで日数や時間を加算し,get() メソッドで日付や時刻を取り出します.

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
import java.util.*;
 
class CalendarTest1 {
	public static void main( String argv[] ) {
 
		int y, m, d, wd2, h, min, sec;
		Calendar cal = Calendar.getInstance();
		String wd[] = { "日", "月", "火", "水", "木", "金", "土" };
 
		/* 2014/01/01, 00:00:00 */
		cal.set(Calendar.YEAR,2012);
		cal.set(Calendar.MONTH,1-1);
		cal.set(Calendar.DATE,1);
		cal.set(Calendar.HOUR_OF_DAY,0);
		cal.set(Calendar.MINUTE,0);
		cal.set(Calendar.SECOND,0);
 
		/* after 86,400 seconds */
		cal.add(Calendar.SECOND,86400);
		y = cal.get(Calendar.YEAR);
		m = cal.get(Calendar.MONTH) + 1;
		d = cal.get(Calendar.DATE);
		wd2 = cal.get(Calendar.DAY_OF_WEEK) - 1;
		System.out.printf("%d/%02d/%02d(%s)\n",y,m,d,wd[wd2]);
 
		/* after 12 Months */
		cal.add(Calendar.MONTH,12);
		y = cal.get(Calendar.YEAR);
		m = cal.get(Calendar.MONTH) + 1;
		d = cal.get(Calendar.DATE);
		wd2 = cal.get(Calendar.DAY_OF_WEEK) - 1;
		System.out.printf("%d/%02d/%02d(%s)\n",y,m,d,wd[wd2]);
 
		/* after 28 Days */
		cal.add(Calendar.DATE,28);
		y = cal.get(Calendar.YEAR);
		m = cal.get(Calendar.MONTH) + 1;
		d = cal.get(Calendar.DATE);
		wd2 = cal.get(Calendar.DAY_OF_WEEK) - 1;
		System.out.printf("%d/%02d/%02d(%s)\n",y,m,d,wd[wd2]);
 
		/* after 24 Hours */
		cal.add(Calendar.HOUR_OF_DAY,24);
		y = cal.get(Calendar.YEAR);
		m = cal.get(Calendar.MONTH) + 1;
		d = cal.get(Calendar.DATE);
		wd2 = cal.get(Calendar.DAY_OF_WEEK) - 1;
		System.out.printf("%d/%02d/%02d(%s)\n",y,m,d,wd[wd2]);
 
		/* after 31,536,000 Seconds */
		cal.add(Calendar.SECOND,31536000);
		y = cal.get(Calendar.YEAR);
		m = cal.get(Calendar.MONTH) + 1;
		d = cal.get(Calendar.DATE);
		wd2 = cal.get(Calendar.DAY_OF_WEEK) - 1;
		System.out.printf("%d/%02d/%02d(%s)\n",y,m,d,wd[wd2]);
	}
}

 このプログラムを実行すると,次のような内容が表示されます.

2012/01/02(月)
2013/01/02(水)
2013/01/30(水)
2013/01/31(木)
2014/01/31(金)

文字列⇔数値の変換

int, long, double といった数値の型の変数と文字列(String)オブジェクトの間で値の変換をすることは,実際のプログラミングでよく行われます.
 
数値から文字列に変換するには valueOf() メソッドを使います.また逆に文字列として表現されている数値を解釈して int, long, double などの型の変数に値を入れるには parse型名() メソッドを用います.
 
これらのメソッドを用いたサンプルを “valueConv1.java” に示します.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class valueConv1 {
	public static void main( String argv[] ) {
		int i = 1;
		long l = 2;
		double f = 3.4;
		String is, ls, fs;
 
		is = String.valueOf(i); //    int -> String
		ls = String.valueOf(l); //   long -> String
		fs = String.valueOf(f); // double -> String
		System.out.printf("\'%s\' , \'%s\' , \'%s\'\n",is,ls,fs);
 
		i = Integer.parseInt(is);   // String -> int
		l = Long.parseLong(ls);	    // String -> long
		f = Double.parseDouble(fs); // String -> double
		System.out.printf("%d , %d , %.1f\n",i,l,f);
	}
}

これを実行すると次のような表示になります.

'1' , '2' , '3.4'
1 , 2 , 3.4

オブジェクトのクラスを調べる方法

オブジェクトが属するクラスを調べる方法です.

getClass() メソッドでクラス情報を取得して,それに対して getName() メソッドをを実行することで,オブジェクトが属するクラスの名前を文字列(String)オブジェクトとして取得することができます.

次のサンプルプログラム “ClassCheck1.java” はそれを実行する例です.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class TestClass {
}
 
class ClassCheck1 {
	public static void main( String argv[] ) {
		String name = "test";
 
		TestClass o = new TestClass();
		name = o.getClass().getName();
		System.out.println(name);
 
		name = name.getClass().getName();
		System.out.println(name);
	}
}

このプログラムを実行すると,次のような表示になります.

TestClass
java.lang.String

ファイルへの出力:テキストファイル

ファイルへの出力の方法です.
ここでは,テキストファイルとしてデータを出力する方法を紹介します.
 

【基本】

次のプログラム “FileWrite1.java” はファイル “text2.txt” に対してテキストデータを出力する例です.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.*;
 
class FileWrite1 {
	public static void main( String argv[] ) {
 
		FileWriter fw;
 
		try {
			fw = new FileWriter("text2.txt");
			fw.write("This is an output data from\n");
			fw.write("FileWrite1.\n");
			fw.write("日本語の出力です.\n");
			fw.close();
		} catch( IOException e ) {
		}
	}
}

ファイルを FileWriter というクラスのオブジェクトとして生成しています.これを実行すると,ファイル “text2.txt” に次のような内容が書き込まれます.

This is an output data from
FileWrite1.
日本語の出力です.

 

【便利な方法】

 FileWriter を元に PrintWriter というクラスのオブジェクトを生成すると,それに対して print, println, printf といった出力用のメソッドを用いて内容を出力することができます.次のプログラム “FileWrite2.java” は printf メソッドを用いて書式を指定して正弦関数の定義域と値域を出力する例です.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.*;
 
class FileWrite2 {
	public static void main( String argv[] ) {
 
		FileWriter fw;
		PrintWriter pw;
 
		try {
			fw = new FileWriter("text3.txt");
			pw = new PrintWriter(fw);
			double x, y;
			for ( x = 0.0; x < 6.3; x += 0.1 ) {
				y = Math.sin(x);
				pw.printf("sin(%.1f) = %.10f\n",x,y);
			}
			fw.close();
		} catch( IOException e ) {
		}
	}
}

これを実行すると,ファイル “text3.txt” に次のような内容が出力されます.

sin(0.0) = 0.0000000000
sin(0.1) = 0.0998334166
sin(0.2) = 0.1986693308
sin(0.3) = 0.2955202067
sin(0.4) = 0.3894183423
 (以下省略)

日付と時間

Javaには日付と時間(時刻)のデータを扱うための高度な機能があります.

ただ,初心者には理解し難いものもあるので,ここでは素朴な例を挙げます.

Javaのクラスライブラリに Date というクラスがあり,このクラスのインスタンスを new で生成すると,現在の日付と時刻に関するデータを保持するオブジェクトができます.

下の例 “DateTest1.java” では年,月,日,曜日,時,分,秒を手軽に取り出すメソッドを備えたクラス Date2(Dateクラスの拡張)を実装しています.

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
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
import java.util.*;
import java.text.*;
 
class Date2 extends Date {
	/*--------------------------------------*
	 * constructor				*
	 *--------------------------------------*/
	Date2(int year, int month, int day) {
	}
	Date2() {
	}
 
	/*--------------------------------------*
	 * methods				*
	 *--------------------------------------*/
	/* Date2 -> Year */
	public int Date2Year() {
		int y;
		SimpleDateFormat f;
		f = new SimpleDateFormat("yyyy");
		y = Integer.parseInt(f.format(this));
		return( y );
	}
	/* Date2 -> Month */
	public int Date2Month() {
		int m;
		SimpleDateFormat f;
		f = new SimpleDateFormat("MM");
		m = Integer.parseInt(f.format(this));
		return( m );
	}
	/* Date2 -> Day */
	public int Date2Day() {
		int d;
		SimpleDateFormat f;
		f = new SimpleDateFormat("dd");
		d = Integer.parseInt(f.format(this));
		return( d );
	}
	/* Date2 -> Week day */
	public String Date2WDay() {
		String wd;
		SimpleDateFormat f;
		f = new SimpleDateFormat("E");
		wd = f.format(this);
		return( wd );
	}
	/* Date2 -> Hour */
	public int Date2Hour() {
		int h;
		SimpleDateFormat f;
		f = new SimpleDateFormat("hh");
		h = Integer.parseInt(f.format(this));
		return( h );
	}
	/* Date2 -> Minute */
	public int Date2Min() {
		int m;
		SimpleDateFormat f;
		f = new SimpleDateFormat("mm");
		m = Integer.parseInt(f.format(this));
		return( m );
	}
	/* Date2 -> Second */
	public int Date2Sec() {
		int s;
		SimpleDateFormat f;
		f = new SimpleDateFormat("ss");
		s = Integer.parseInt(f.format(this));
		return( s );
	}
}
 
class DateTest1 {
	public static void main( String argv[] ) {
		int y,m,day,h,min,sec;
		String wd;
 
		Date2 d = new Date2();	// 現在の日付,時刻の取得
		y = d.Date2Year();	// 年の取得
		m = d.Date2Month();	// 月の取得
		day = d.Date2Day();	// 日の取得
		wd = d.Date2WDay();	// 曜日の取得
		h = d.Date2Hour();	// 時の取得
		min = d.Date2Min();	// 分の取得
		sec = d.Date2Sec();	// 秒の取得
		System.out.printf("%d/%d/%d (%s), %s:%s:%s\n",
					y,m,day,wd,h,min,sec);
	}
}

このプログラムを実行すると,その時の日付と時刻を表示します.

ファイルの読込み:テキストファイル

テキストファイルを読み込む方法です.
 
基本的にファイルは入力ストリームなので,内容は先頭から順番に読み込まれます.
ここでは次の3つの方法を順番に説明します.

1) ファイルから「1バイトづつ」読み込む方法
2) ファイルから「1文字(多国語含む)づつ」読み込む方法
3) ファイルから「1行づつ」読み込む方法
 
次ような内容のファイル “text1.txt” があるものとして,この内容を読み込む方法を説明します.
 

1
2
3
Alphabet
日本語
English and 日本語 混在

 

【ファイルから「1バイトづつ」読み込む方法】

 ファイルを FileInputStream として開き,それに対して read() メソッドを実行すると1バイトづつ読み込むことができます.読み取ったデータは int 型整数として与えられます.(下記:”FileRead1.java”)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.*;
 
class FileRead1 {
	public static void main( String argv[] ) {
 
		FileInputStream fi;
		int c, i = 0;
 
		try {
			fi = new FileInputStream("text1.txt");
			while ( (c = fi.read()) != -1 ) {
				i++;
				System.out.println( i+":"+(char)c );
			}
			fi.close();
		} catch( IOException e ) {
			System.out.println("ファイルがオープンできません\n");
			System.exit(-1);
		}
	}
}

 この方法は最も基本的ですが,1バイトづつ読むため能率がよくありません.また多バイトからなる多国語文字を認識しないため実行すると文字化けが起こります.実行結果の表示を下に示します. 

1:A
2:l
3:p
4:h
5:a
6:b
7:e
8:t
9:
 
10:æ
11:—
12:¥
13:æ
14:œ
15:¬
16:è
17:ª
18:ž
19:
 
20:E
21:n
22:g
23:l
24:i
25:s
26:h
27: 
28:a
29:n
30:d
31: 
32:æ
33:—
34:¥
35:æ
36:œ
37:¬
38:è
39:ª
40:ž
41:ã
42:€
43:€
44:æ
45:·
46:·
47:å
48:œ
49:¨
50:

 

【ファイルから「1文字(多国語含む)づつ」読み込む方法】

 入力するデータを「文字データ」として認識して1文字づつ読み取る方法です.ファイルを FileInputStream として開き,更にそれを元にして InputStreamReader というオブジェクトを生成し,それに対して read() メソッドを実行すると「1文字づつ」読み込むことができます.読み取ったデータは int 型整数として与えられます.(下記:”FileRead2.java”)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.*;
 
class FileRead2 {
	public static void main( String argv[] ) {
 
		FileInputStream fi;
		InputStreamReader isr;
		int c, i = 0;
 
		try {
			fi = new FileInputStream("text1.txt");
			isr = new InputStreamReader(fi,"UTF-8");
			while ( (c = isr.read()) != -1 ) {
				i++;
				System.out.println( i+":"+(char)c );
			}
			fi.close();
		} catch( IOException e ) {
			System.out.println("ファイルがオープンできません\n");
			System.exit(-1);
		}
	}
}

 この方法では多バイトからなる多国語文字を認識するため,文字化けは起こりません.実行結果の表示を下に示します.

1:A
2:l
3:p
4:h
5:a
6:b
7:e
8:t
9:
 
10:日
11:本
12:語
13:
 
14:E
15:n
16:g
17:l
18:i
19:s
20:h
21: 
22:a
23:n
24:d
25: 
26:日
27:本
28:語
29: 
30:混
31:在
32:

 また,ファイルを FileReader として開いてそれに対して read() メソッドを実行する方法(下記;”FileRead3.java”)もあり,同じ結果を得ることができます.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.*;
 
class FileRead3 {
	public static void main( String argv[] ) {
 
		FileReader fr;
		int c, i = 0;
 
		try {
			fr = new FileReader("text1.txt");
			while ( (c = fr.read()) != -1 ) {
				i++;
				System.out.println( i+":"+(char)c );
			}
			fr.close();
		} catch( IOException e ) {
			System.out.println("ファイルがオープンできません\n");
			System.exit(-1);
		}
	}
}

 

【ファイルから「1行づつ」読み込む方法】

 おそらく一番実用的な方法かと思います.テキストファイルを「1行づつ」読み取って String クラスの文字列オブジェクトとして取り出す方法です.(下記:”FileRead4.java”)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.*;
 
class FileRead4 {
	public static void main( String argv[] ) {
 
		FileReader fr;
		int i = 0;
		String b;
 
		try {
			fr = new FileReader("text1.txt");
			BufferedReader br = new BufferedReader(fr);
			while ( (b = br.readLine()) != null ) {
				i++;
				System.out.println( i+":"+b );
			}
			fr.close();
		} catch( IOException e ) {
			System.out.println("ファイルがオープンできません\n");
			System.exit(-1);
		}
	}
}

 これを実行すると次のようになります.

1:Alphabet
2:日本語
3:English and 日本語 混在

 

【コンマ区切りの文字列(CSVデータ)の分離】

 コンマ区切りデータ(CSVデータ)を1行づつ読み取った場合に,その行をコンマ毎に区切ってバラバラの文字列にする方法を説明します.今回例に使用するのは,総務省が配布する「標準地域コード」です.このデータは次のように8つの項目からなり,それをCSVデータにしたファイル “ChiikiCode.csv” を読み込む例です.
 1. 都道府県コード
 2. 市町村コード
 3. 地域コード
 4. 都道府県名
 5. 市町村名1
 6. 市町村名2
 7. 市町村名3
 8. 読みがな
このファイルの内容は次のようなものです.

1,0,1000,北海道,,,,ほっかいどう
1,100,1100,北海道,札幌市,,,さっぽろし
1,101,1101,北海道,札幌市,,中央区,ちゅうおうく
1,102,1102,北海道,札幌市,,北区,きたく
  (以下省略)

このデータを読み取って,3〜8の項目を表示するプログラム “CSVtest1.java” を下に示します.

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
import java.io.*;
 
class CSVtest1 {
	public static void main( String argv[] ) {
 
		FileReader fr;
		int i = 0;
		String b;
		String csv[] = new String[20];
 
		try {
			fr = new FileReader("ChiikiCode.csv");
			BufferedReader br = new BufferedReader(fr);
			while ( (b = br.readLine()) != null ) {
				i++;
				csv = b.split(",");
				System.out.print("("+i+")");
				System.out.printf("\t地域コード: %s\n",csv[2]);
				System.out.printf("\t%s%s%s%s",csv[3],csv[4],csv[5],csv[6]);
				System.out.printf("(%s)\n",csv[7]);
			}
			fr.close();
		} catch( IOException e ) {
			System.out.println("ファイルがオープンできません\n");
			System.exit(-1);
		}
	}
}

このプログラムを実行した様子を下に示します.

(1)     地域コード: 1000
        北海道(ほっかいどう)
(2)     地域コード: 1100
        北海道札幌市(さっぽろし)
(3)     地域コード: 1101
        北海道札幌市中央区(ちゅうおうく)
(4)     地域コード: 1102
        北海道札幌市北区(きたく)
  (以下省略)

JavaFX GUIアプリ構築入門(NetBeans IDE)

マニュアルをまとめつつあります.)
 
 実用的なGUIアプリを構築するにはボタンやメニューを始めとする各種のコントロール(GUI部品)を多数使用しますが,それらを全て手作業でコーディング(プログラムのソースコードの手入力)するのはとても煩わしく,生産的ではありません.
 
 統合開発環境(IDE)と呼ばれるツールを用いることで直感的にGUIを構築することができ,それに対応するコースコードを自動的に生成することができます.ここでは NetBeans IDE というツールを用いて手軽にGUIアプリを構築する手順を紹介します.
 
NetBeans IDEはこのサイトからダウンロードできます.
 
またGUIを直感的に構築・編集するためには JavaFX SceneBuilder も入手してインストールしておく必要があります.(入手はこちら)
 

【プログラム作成手順】

 NetBeans IDEを起動して「ファイル」→「新規プロジェクト」を選びます.(下図参照)
NetBeans01
 次に,下のような表示になるので,「カテゴリ」から「JavaFX」を選択し,「プロジェクト」から「JavaFX FXMLアプリケーション」を選んで「次へ」ボタンをクリックします.
NetBeans02
 次に,下のような表示になるので,プロジェクト名やプロジェクトに関連するファイル群を保存する場所などを設定して「終了」ボタンをクリックします.
NetBeans03
 プロジェクトとはプログラム開発作業に関連するファイルや設定などをまとめたものだと考えてください.1つの開発単位は1つのプロジェクトとして1つのフォルダにまとめて保存されます.この例では “JavaFXMLApplication1” という名前のプロジェクトを作成しています.
 
 以上の作業で新規プロジェクトの作成が完了してプログラムの開発作業が可能になります.(下のような表示となります)
NetBeans04

プロジェクトを作成して開発準備が整うと最初の段階で次のようなファイル群が生成されます.

  1. mainメソッドを収めたアプリケーションの最上位のソースコード
     プロジェクト名と同じ名前のソースファイルが生成されます.上の例では “JavaFXMLApplication1.java” というソースファイルが生成されます.

  2. GUIを記述するFXMLファイル
     JavaFXではXML形式(FXML形式)でGUIを構築することができ,デフォルトでは “FXMLDocument.fxml” という名前のファイルが生成されます.

  3. GUIのイベントハンドリングのためのソースコード
     GUIからのイベントを受けて起動するメソッド群を記述するソースコードで,デフォルトでは “FXMLDocumentController.java” という名前のファイルが生成されます.

 
 プロジェクト生成直後は,サンプルとして1つのボタンのみを備えたGUIのアプリケーションのためのソースコードになっており,これを改造して独自のアプリケーションに仕上げていきます.
 
GUIの追加とイベントハンドリングの記述:
 NetBeans IDEの「プロジェクト」タブからFXMLファイルをダブルクリックすると JavaFX SceneBuilder が起動してGUIの編集が始まります.(下図)
SceneBuilder01
 
 例えばこのインターフェースにメニューバーを取り付け,「File」メニューの「Close」を選択するとプログラムが終了するようなアプリケーションに改造してみます.

  • ステップ1: メニューバーの取り付け
     SceneBuilderウィンドウの左端の「Control」の中から「MenuBar」を選び,これをGUIの上にドラッグ&ドロップするとメニューバーが設置できます.(下図)
    SceneBuilder03

  • ステップ2: メニューとメニュー項目の取り付け
     ウィンドウ左端の「Menu」から「Menu」や「MenuItem」を選んでメニューバーに取り付けていきます.この例では,予め登録されているメニュー項目「Close」があるので,取り付け作業の説明は省略します.

  • ステップ3: GUIへのイベントハンドリングの登録
     GUIのメニューバーを選択しておき,ウィンドウ左端の「Hierarchy」の中から「MenuItem Close」を選択します.次にウィンドウ右端の「Code : MenuItem」の中にある該当イベントの部分(この例では「OnAction」)に,そのイベントが起こったときに起動するメソッドの名前を入力します.この例では「Close」を選択したときに “QuitAction” というメソッドが起動するように設定しています.

  • ステップ4: ソースコードの追加
     ”FXMLDocumentController.java” の中に,イベントに対応して起動するメソッドを記述します.この例では「QuitAction」というメソッドの記述を追加しています.

 
 以上の作業で出来上がったコードを下に示します.
 
ソースコード “JavaFXMLApplication1.java”

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
package javafxmlapplication1;
 
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
 
public class JavaFXMLApplication1 extends Application {
 
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
 
        Scene scene = new Scene(root);
 
        stage.setScene(scene);
        stage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
 
}

 
FXMLのコード “FXMLDocument.fxml”

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
<?xml version="1.0" encoding="UTF-8"?>
 
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
 
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="javafxmlapplication1.FXMLDocumentController">
    <children>
        <Button fx:id="button" layoutX="126" layoutY="90" onAction="#handleButtonAction" text="Click Me!" />
        <Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" />
      <MenuBar layoutY="2.0" prefHeight="25.0" prefWidth="320.0">
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
              <MenuItem mnemonicParsing="false" onAction="#QuitAction" text="Close" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Edit">
            <items>
              <MenuItem mnemonicParsing="false" text="Delete" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Help">
            <items>
              <MenuItem mnemonicParsing="false" text="About" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
    </children>
</AnchorPane>

 
イベントハンドリングのためのソースコード “FXMLDocumentController.java”

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
package javafxmlapplication1;
 
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
 
public class FXMLDocumentController implements Initializable {
 
    @FXML
    private Label label;
 
    @FXML
    private void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
        label.setText("Hello World!");
    }
 
    @FXML
    private void QuitAction(ActionEvent event) {
        System.out.println("You Selected Quit from menu.");
        Platform.exit();
    }
 
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    
 
}

 
 上のコードに追加したイベント用のメソッド「QuitAction」の中の Platform.exit(); という記述はアプリケーションの終了処理を行うものです.
 
注意: FXMLで構築したコントロール(GUI部品)はこのクラス内のオブジェクトとして宣言する必要があり,宣言文の直前にはアノテーション「@FXML」を記述する必要があります.
 

【プログラムの実行】

 作成したプログラムを実行するには,NetBeans IDEのメニュー「実行」から「プロジェクト…を実行」を選びます.(下図)
NetBeans05
するとプログラムがコンパイルされて実行されます.(下図)
NetBeans08
 

【アプリケーションのビルド】

 作成したプログラムを,単体で実行できるパッケージにビルドするには,NetBeans IDEのメニュー「実行」から「プロジェクト…をビルド」を選びます.(下図)
NetBeans09
 
この操作によって,ビルドされたパッケージが “.jar” という拡張子のついたファイルとして,プロジェクトフォルダ内の “dist” フォルダの中に生成されます.(下図)
NetBeans10
 
 このjarファイルはダブルクリックで実行を開始することができます.

——————————————————-
FXMLアプリケーション構築例(NetBeans IDE & Java FX Scene Builder)
 画像ビューワ(複数ウィンドウを持つアプリ)

JavaFX GUIアプリ構築入門

マニュアルをまとめつつあります.)
 
JavaFXによるGUIアプリ構築の入門です.

【基本1】
・ JavaFXアプリは Application クラスの拡張クラスとして作成する.
・ mainの中で launch メソッドを呼び出すことでGUIアプリが開始する.
・ launchメソッドは start メソッドを呼び出す.startメソッドの中で具体的にGUIを構築する.

サンプルプログラム:
 サンプルプログラム “JavaFXApplicationSample1.java” を次に示します.これは非常に単純なGUIアプリのサンプルで,「”Say ‘Hello World'”」ボタンをクリックすると “Hello World!” を標準出力(コマンド画面)に表示するだけです.

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
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
 
public class JavaFXApplicationSample1 extends Application {
 
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
 
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
 
        StackPane root = new StackPane();
        root.getChildren().add(btn);
 
        Scene scene = new Scene(root, 300, 250);
 
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
 
}

これをコンパイルして実行した例を次に示します.
JavaFXApplicationSample1_exe
 
サンプル “JavaFXApplicationSample1.java” でのGUI構築の流れ:
 GUIのインスタンスは Pane (ペイン)と呼ばれる「台紙」のようなものの上に取り付けて行きます.Paneには特徴がそれぞれ異なる複数のクラスがあり,例のプログラムでは StackPane というクラスのインスタンス “root” を生成して,それをGUIの「台紙」にしています.また複数のPaneを階層構造で管理することができます.
 
 例のプログラムでは root に対して予め生成しておいたボタン “btn” を下位のオブジェクトとして登録して取り付けています.ボタンにイベントを登録するために setOnAction メソッドを使用しています.
 
 
————————————————————————-
【JavaFXアプリ構築の考え方】
 JavaFXアプリは Stage の上に構築される世界です.すなわち,Stage の上にウィンドウとなる Pane オブジェクトを配置して,それをアプリのGUIとします.

 Stage は Pane オブジェクト毎に設置します.すなわち,複数の Pane オブジェクトを用いる場合は,そのオブジェクト毎に Stage を生成し,それらを最初の Stage の配下に配置します.(initOwnerメソッドを使って Stage の上下関係を結びます)
 
Paneオブジェクトの配下に Controlls(GUI部品群)を配置する空間が Scene です.Scene オブジェクトは Pane オブジェクト毎に生成します.
 
あとは,Pane オブジェクトに必要なコントロール(GUI部品)群を登録します.
このようにしてGUI世界ができあがります.
 
このようなGUI構築作業を start メソッドの中に記述するわけです.
 
————————————————————————-
【特徴的な Pane】
● Accordion
Accordion
 
● ScrollPane
ScrollPane
 
● SplitPane(水平)
SplitPane_H
 
● SplitPane(垂直)
SplitPane_V
 
● TabPane
TabPane
 
 
——————————————————-
FXMLアプリケーション構築例(NetBeans IDE & Java FX Scene Builder)
 画像ビューワ(複数ウィンドウを持つアプリ)

ファイル入出力 (1)

ファイルからデータを読み込んだり,ファイルに対してデータを書き出したりする方法です.
今回は1バイトづつ入出力する方法です.
 
基本的なこととして理解しておくことがあります.
それは,「ファイルに格納されているデータは1バイトづつのデータが直線的に並んでいる」
ということです.

つまりファイルからデータを読み込む際,ファイルの先頭から末尾にかけて
1バイトづつデータを取り出すという作業になります.

同様に,ファイルに対してデータを出力する際,ファイルの先頭から末尾にかけて
1バイトづつデータを書き込むことになります.

ストリームという概念
 順番にデータを入出力する対象をストリームと呼びます.
 順番にデータがもたらされる入力を「入力ストリーム」,順番にデータを書き込む形の出力を
「出力ストリーム」と呼ぶことがあります.

【ファイルから入力する例】
 ファイルから1バイトづつデータを読み込んで,それを次々と標準出力(コマンド画面)に表示するプログラムの例です.
 まず次のような内容のテキストファイル “InputFile” があると仮定します.

This is a sample text data.

このファイルから1バイトづつデータを読み込んで,それを標準出力に表示するプログラム “FileTest01.c” を次に示します.

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
#include	<stdio.h>
 
#define		TRUE		-1
#define		FALSE		0
 
int main()
{
	FILE	*fi;
	int	c;
 
	fi = fopen( "InputFile", "r" );
	if ( fi == NULL ) {
		printf("InputFile can not be opened!\n");
		return(FALSE);
	}
 
	printf("Start---\n");
	while ( TRUE ) {
		c = getc(fi);
		if ( feof(fi) ) {
			break;
		}
		putchar(c);
	}
	printf("End---\n");
 
	fclose(fi);
	return(TRUE);
}

 
【ファイルにデータを書き込む例】
 ファイルにデータを書き込む方法について紹介します.
1バイトづつデータを出力する例

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
#include	<stdio.h>
 
#define		TRUE		-1
#define		FALSE		0
 
int main()
{
	FILE	*fo;
	int	c;
 
	fo = fopen( "OutputFile", "w" );
	if ( fo == NULL ) {
		printf("OutputFile can not be created!\n");
		return(FALSE);
	}
 
	printf("Start---\n");
	for ( c = 97; c < 123; c++ ) {
		putc(c,fo);
	}
	printf("End---\n");
 
	fclose(fo);
	return(TRUE);
}

 この例では,アルファベット小文字の ‘a’〜’z’ をファイル “OutputFile” に書き込んでいます.
 
コマンド画面に出力するようなスタイルで出力する例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include	<stdio.h>
 
#define		TRUE		-1
#define		FALSE		0
 
int main()
{
	FILE	*fo;
	int	c;
 
	fo = fopen( "OutputFile", "w" );
	if ( fo == NULL ) {
		printf("OutputFile can not be created!\n");
		return(FALSE);
	}
 
	printf("Start---\n");
	fprintf(fo,"This file is created by the program \'FileTest03.c\'.\n");
	fprintf(fo,"This is one easy way of output.\n");
	printf("End---\n");
 
	fclose(fo);
	return(TRUE);
}

このプログラムを実行すると “OutputFile” というファイルが作成され,内容は

This file is created by the program 'FileTest03.c'.
This is one easy way of output.

となります.