投稿者「admin」のアーカイブ

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.

となります.

GMPでの基本的なデータ型

GMPで扱う数値の型は基本的には次の3つです.
 
1) mpz_t : 多倍長整数
2) mpq_t : 多倍長有理数(分数表現)
3) mpf_t : 多倍長浮動小数点数
 
【mpz_t】
 桁の長い整数の計算を行う場合に用いる型です.計算機環境の記憶資源が許す限り大きな桁数の計算ができます.
 
【mpq_t】
 除算(割り算)を行う場合に精度を落とさずに計算を行うには有利数(分数)を用います.ただし有理数の値の乗算・除算を繰り返すと分母,分子ともに大きな数になっていくので,記憶資源の消費量と計算時間がともに大きくなっていきます.
 計算の有効桁数(精度)を限定すると記憶資源の消費量と計算時間を一定の程度に抑えることができるので,その場合は次の mpf_t の型で計算を行うのが良いです.
 
【mpf_t】
 有効桁数を指定して(長く指定することも可)精度を限って計算を行う場合に使用する型です.

コマンドサーチパスの設定(Windows)

 コマンドとして起動できるプログラムの在処は,環境変数 PATH に設定しおきます.そのための設定作業を以下に示します.

1) デスクトップの「コンピュータ」アイコンを右クリックし,ポップアップメニューから「プロパティー」を選択します.
EnvPath0

2) 「システムの詳細設定」をクリックします.
EnvPath1

3) 「詳細設定」タブの「環境設定」ボタンをクリックします.
EnvPath2

4) 「システム環境設定」セクションの Path を選択して「編集ボタン」をクリックします.
EnvPath3

5) 「変数値」の項目にコマンドを格納するディレクトリのパスを追加します.
EnvPath4
 「変数値」には既に何らかのコマンドサーチパスが設定されており,それを破壊すべきではありません.既存のサーチパスにセミコロン「;」を区切り文字に使用して追加していきます.

wxWidgetsのインストール

ここでは,MinGW環境下でのwxWidgetsのインストール方法をまとめます.

UNIX環境下でソフトウェアをインストールする場合,C言語などで記述されたソースプログラムからコンパイルしてインストールすることが一般的な方法の1つとなっています.

MinGW環境下ではC言語のコンパイラ(GCC)が使用できるので,これに基いてコンパイルとインストールを行うわけです.

wxWidgetsは https://www.wxwidgets.org/ のサイトで配布されています.
 
 
例.ソースパッケージ wxWidgets-3.0.2.zip をインストールする作業

Step-0: wxWidgets-3.0.2.zipを展開してソースパッケージ用フォルダ wxWidgets-3.0.2 を作ります.これを C:¥ に配置します.
 
 
Step-1: MinGWのヘッダファイルの編集
C:¥MinGW¥include¥commctrl.hの中に

#define TV_DISPINFO __AW(NMTVDISPINFO)

という行がありますが,(探してください)これを,

#define TV_DISPINFO NMTVDISPINFO

に変えてください.(くれぐれも慎重に!.全角文字はNG!)
 
 
Step-2: MinGW Shellを起動して,カレントディレクトリを C:¥wxWidgets-3.0.2 に移動する.
 
 
Step-3: 下記のコマンドを発行する.(コンパイル環境の準備)

./configure --prefix=/mingw --enable-unicode --disable-debug --disable-shared --with-msw --with-regex

この処理を確実にしないといけません(試練!)
しかもこの処理は結構時間がかかります.マシンの性能が低い場合は30分くらいかかったりします.
 
 
Step-4: 下記のコマンドを発行する.(コンパイル処理)

make all

 
Step-5: 下記のコマンドを発行する.(インストール処理)

make install

参考)Step-4 を省略して,Step-5を実行してもよい.

この処理も確実にしないといけません(試練!)
Step-4〜5はかなり時間がかかります.マシンの性能が低い場合は1時間くらいかかったりします!
 
 
トラブル対処例: コンパイル中に「wctype.hが無い!」と言われたら…

C:¥MinGW¥include¥wctype.h

C:¥MinGW¥msys¥1.0¥include

に複写してStep-3に戻ってみてください.
 
 
インストールが完了したら,C:¥wxWidgets-3.0.2¥samples 配下のどれかのサンプルを make して,そのアプリが出来上がること,またそれが実行できることを確認してください.

MinGWのインストール

MinGWは http://www.mingw.org/ のサイトから入手できます.

インストールすると(デフォルトでは)C:¥MinGW ディレクトリに関連パッケージがインストールされます.

MinGWには,UNIX系のOSで利用できる基本的な開発ツール(C言語コンパイラ関連など)が含まれており,徐々にソフトウェアを追加インストールしてゆくとUNIXに近い環境ができます.

MinGWインストール後は MinGW Installer(下記)がデスクトップに表示されるので,以後はこれを起動してパッケージの追加や削除,更新などの管理ができます.
MinGWinstaller
MinGW Installer を起動すると次のようなウィンドウが表示され,ここでパッケージを選択して追加,削除,更新を行います.
MinGWpkgSel
どのパッケージが必要かを判断するのが面倒な場合は,思い切って全部インストールしても良いと思います.
全部インストールすると時間もかかるので,”bin”,”dev”,”dll”のクラスのものだけ選んでインストールすると良いかもしれません.(”lic”はよくわからないのでとりあえずインストール…)

MinGW の利用は基本的にはコマンドシェル(UNIX系OSでよく用いられるコマンドプロンプト)による操作となります.「MinGW Shell」を起動すると,UNIX独自のコマンドプロンプト(bash)が起動して,コマンド入力による操作が可能になります.

WindowsのコマンドプロンプトでMinGWのコマンドを利用することも可能ですが,そのためにはMinGWのコマンドが格納されているディレクトリにコマンドサーチパスを設定しておく必要があります.
環境変数 PATH に「C:\MinGW\bin;C:\MinGW\mingw32\bin;C:\MinGW\msys\1.0\bin;C:\MinGW\msys\1.0\sbin」の順序で追加しておくと良いでしょう.(コマンドサーチパスの追加方法に関してはこちらを参照のこと

WordPressの記事の中で各種ソースプログラムを綺麗に表示する方法

プラグイン「WP-Syntax」をインストールし,記事の中で

<pre lang=”コンピュータ言語” line=”開始行番号”>ソースコード</pre>

とタグを記述する.

例えば:

1
2
3
4
5
6
#include <stdio.h>
 
int main()
{
	printf("Hello, World.¥n");
}

また,”line=”を省略すると,

#include <stdio.h>
 
int main()
{
	printf("Hello, World.¥n");
}

と,行番号無しとなる.