Java StepUpPrograming〜JavaFX で四則計算〜

イントロダクション

前回はJavaFXでのハローワールドのプログラムを眺めてみました。くどいようですが、以下の手順を繰り返していきます。

  1. とりあえずコードを書く
  2. 自分で動かしてみる
  3. 書いた内容を適度に理解

そして、作成したプログラムをカスタムしながらプログラムをどんどん成長(?)させていきます。

四則計算をする

四則計算=「足し算、引き算、掛け算、割り算」をやります。修正する部分は「myFirstProgram」メソッドです。修正前のソースを下に示します。

<修正前>

/**
 * JavaFX版のハローワールド実装用のメソッドになります。
 * @return 画面に出力する文字列
 */
public String myFirstProgram() {
    // この「hyoji = ""」を「"hyoji = "Hello World"」と修正してください。
    String hyoji = "Hello World";
    return hyoji;
}

とりあえず、四則計算を行うためには「文字」では計算できません。

ここでJavaのルール

// 文字列の書き方
String moji = "ab12@$#";
// 数値(整数)の書き方
int suji = 123;
// 数値(小数点)
double shosu = 12.3;
// 大きい数値
long ookii = 12345678901L;

ルールというよりも「データ型」と呼ぶのが一般的です。わかりやすいだろうと思いこのように記載しました。ちなみに「int」型で「12345678901」を代入するとビルドエラーになります。

int型の値が取れる大きさを超えてしまうためです。この部分は2進数を勉強することになるので後日。。。

計算するための入力部を作る

JavaFXでの実装なので計算するための入力する場所が必要です。ここでは「テキストフィールド」を使用して計算用入力コンポーンネントを作成します。
<出来上がりのイメージ>

<テキストフィールドの作り方>

とりあえずコードを書く

public void start(Stage primaryStage) throws Exception {
    // Stageの設定
    primaryStage.setHeight(VIEW_HEIGHT);
    primaryStage.setWidth(VIEW_WIDTH);
    // ラベルの設定
    Label label = new Label();

    // ハローワールドを出力する
    label.setText(myFirstProgram());
    label.setFont(new Font("RobotRegular", 24));

    // ペインの作成
    Group root = new Group();
    root.getChildren().add(label);

    // 1個目の数値、テキストフィールド
    TextField text1 = new TextField();
    text1.setPrefColumnCount(3);
    text1.setAlignment(Pos.BASELINE_CENTER);

    // 計算式のラベル
    Label ope = new Label("+");

    // 2個目の数値、テキストフィールド
    TextField text2 = new TextField();
    text1.setPrefColumnCount(3);
    text1.setAlignment(Pos.BASELINE_CENTER);

    root.getChildren().add(text1);
    root.getChildren().add(ope);
    root.getChildren().add(text2);

    // シーンの作成
    Scene scene = new Scene(root, VIEW_WIDTH, VIEW_HEIGHT);
    primaryStage.setScene(scene);
    primaryStage.show();
}

これで表示してみます。

テキストフィールドが1こあるだけです。これは、想定していた結果と違います。
なので、どこかしらに不適切な処理があるということです。

デバックのポイント

  1. 予想→仮説を立てる
  2. その仮説を検証・実証する

何やら難しい言葉を使いましたが、早い話が「多分こーなってるから、こーすればなおるんぢゃね?」と試してみることです。

うまくいかない原因を考える

<ポイント>

  1. コードからコンポーネント(ラベルなど)が追加されてはいるようだ。。。
  2. 表示した結果、ちょっと重なっているのかも?と予想する。

<仮説>

コンポーネントが重なって表示されているので1つしかないように見える。なのでコンポーネントの位置をずらして表示してみる。

ちょっと調べてみると、こんなサイトにたどり着きました。

ここをみるとコンポーネントを並べるのに「HBox」クラスを使用しているので真似してみます。細かい使い方はJavaDoc(HBox)をみます。JavaDocはリリースされている全てのクラスの説明があるので読めるようになると「Javaは使えるようになった」と言って過言ではありません。

ちなみに、HBoxは横にレイアウトするクラスのようです。なので「縦のクラス」もあるだろうと思い、探してみました。こんなサイトがあり、そこに

「VBoxクラス」というものがあるようです。じゃ使ってみようと思います。

<レイアウトのイメージ>

HBox
VBox

実行結果は下のような感じになりました。

  • VBoxで縦に、「Hello World」と「テキストフィールドの塊」を並べた。
  • HBoxで横に「テキストフィールド」と「+」「テキストフィールド」を並べた。

<ソース>

public void start(Stage primaryStage) throws Exception {
    // Stageの設定
    primaryStage.setHeight(VIEW_HEIGHT);
    primaryStage.setWidth(VIEW_WIDTH);
    // レイアウトたて
    VBox vBox = new VBox(5);
    // レイアウト横
    HBox hBox = new HBox(8);
    // ラベルの設定
    Label label = new Label();
    // ハローワールドを出力する
    label.setText(myFirstProgram());
    label.setFont(new Font("RobotRegular", 24));
    vBox.getChildren().add(label);

    // 1個目の数値、テキストフィールド
    TextField text1 = new TextField();
    text1.setPrefColumnCount(3);
    text1.setAlignment(Pos.BASELINE_CENTER);
    hBox.getChildren().add(text1);
    // 計算式のラベル
    Label ope = new Label("+");
    hBox.getChildren().add(ope);

    // 2個目の数値、テキストフィールド
    TextField text2 = new TextField();
    text1.setPrefColumnCount(3);
    text1.setAlignment(Pos.BASELINE_CENTER);
    hBox.getChildren().add(text2);

    // 縦のレイアウトに追加する
    vBox.getChildren().add(hBox);
    // ペインの作成
    Group root = new Group();
    root.getChildren().add(vBox);

    // シーンの作成
    Scene scene = new Scene(root, VIEW_WIDTH, VIEW_HEIGHT);
    primaryStage.setScene(scene);
    primaryStage.show();
}

あ、「=」つけてない。。。じゃ、ここは。。。

クイズです。

上のものに「=」と答えを表示する領域を追加して「入力1」+「入力2」の計算結果を表示するプログラムを書いてください。

<ヒント>

ここまでのソースをGITにアップしておきます。

クイズの答え

同じページに書くのもアレなんでこちらにあります。

でわでわ。。。

前へ<<< >>>次へ

ステップアッププログラミング〜Java FxでHelloWorld解説〜

イントロダクション

前回は、Java Fxでハローワールドをやりました。初めてのプログラムなので、写経しただけで終わりました。一応ですが、ハローワールドからOpenCVのビデオキャプチャ・プログラム(チュートリアル版)を完成させるまでをやります。

大切なのは、以下の工程です。

  1. とりあえずコードを書く
  2. 自分で動かしてみる
  3. 書いた内容を適度に理解

この工程を繰り返してやる事で自然とプログラムがわかるようになりました。(自分の場合)

なので、このやり方をサンプルに自分なりの理解の仕方を、後々で良いので見つけて下さい。

コード内容

とりあえず、仕組みの概要を図にしました。

前回のコードでは「自作のメソッド」にプログラムを書き込みました。ほとんどの部分をフレームワークが処理している状態です。

コード解説

https://www.youtube.com/watch?v=8aHXPA0J9rY&t=12s

<メインメソッド>

/**
 * メインメソッド
 * @param args プログラム引数
 */
public static void main(String[] args) {
    // 親クラスのメソッドを呼び出す、これは上のstart()を呼び出す。
    launch();
}

Javaでのプログラムは必ずMainメソッドから始まります。サーバーアプリはMainメソッドがないとか言いますが、サーバーを起動するときにMainメソッドが動いていますので安心してください。(C言語でサーバーを動かしてもMainメソッドはあります。)

ここでは、単純に親クラスの「launch」メソッドを起動します、このメソッドは「start」メソッドを起動するので次に「startメソッド」をオーバーライドしてやり親クラスから自分が実装したメソッドを起動できるようにしてやります。

ちょっとわかりずらいので、コード紹介と解説をします。

オーバーライドについて

下のようなクラスがあったとします。このクラスは親クラスです。

public Parent {

 public void launch() {
    int i = 10 + 8;
    System.out.println(i);
    hello();
    System.out.println("プログラム終了");
 }

 public void hello() {
   System.out.println("Hello World");
 }
}

次に子クラスです。下のように、子クラスにメインメソッドがあり、親クラス「hello()」メソッドをおオーバーライドしています。
個状態でプログラムを起動すると、次のような表示結果が出ます。

public ChildCls extends Parent {
  @Override
  public void hello() {
    System.out.println("Good morning!");
  }
  public static void main(String[] args) {
    launch();
  }
}

<表示結果>

Good morning!
プログラム終了

プログラムの実行順序は、次の通りです。※「クラス名#メソッド名」の形で書きます。

  1. ChildCls#main()が起動し、Parent#launch()を呼び出します。
  2. Parent#hello()を呼び出しますが、ChildClsでオーバーライドしているので、ChildCls#hello()を呼び出します。

このような感じで、Application#start()をオーバーライドしているので、JavaFXでのGUI作成は画面の作成を中心にコーディングができます。

サンプルコード(GIT)

<startメソッド>

/**
 * 親クラスのメソッドをオーバーライドする。
 * 画面を作成したり、シーンを作成したり、色々。。。
 * 
 * @see javafx.application.Application#start(javafx.stage.Stage)
 */
@Override
public void start(Stage primaryStage) throws Exception {
    // Stageの設定
    primaryStage.setHeight(VIEW_HEIGHT);
    primaryStage.setWidth(VIEW_WIDTH);
    // ラベルの設定
    Label label = new Label();

    // ハローワールドを出力する
    label.setText(myFirstProgram());
    label.setFont(new Font("RobotRegular", 24));

    // ペインの作成
    Group root = new Group();
    root.getChildren().add(label);

    // シーンの作成
    Scene scene = new Scene(root, VIEW_WIDTH, VIEW_HEIGHT);
    primaryStage.setScene(scene);
    primaryStage.show();
}

このメソッドの引数「primaryStage」に以下の処理を行います。

  1. 画面サイズを指定(縦、横)
  2. 文字列などを表示するため「ラベル」を作成
  3. ラベルに文字列を設定(テキスト)
  4. ペインに乗せたラベルをシーンに登録
  5. ステージにシーンを登録
  6. ステージの表示

「myFirstProgram」メソッドは自分んで文字列を返却するようにコーディングしてください。サンプルのコードはGITにアップしてあります。

全体として

このような形で「JavaFX」を使用します。とりあえずは「JavaFXはフレームワークなんだな」と理解しておいてください。

 

はじめの一歩として

JavaFX版のハローワールドプログラムですので、作成したコードを色々といじってみるのも一興です。参考にJavaFXではない、普通のJava版のハローワールドが下のリンク先にあります。

  1. Java Basic Level 1 Hello Java

<<< 前へ 次へ >>>

Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜

イントロダクション

プログラムを学習する事で、身につく事が結構あります。例えばしたのようなことです。

  • 物事を順序だてて考える、説明する
  • 知りたい事を明確に言葉にする
  • 物事の問題究明の手順を導く
  • 目的の為にロードマップを作れる

以上のようなものがありますが、このように認識する、しないは本人次第になります。早い話が理論的思考が身につくと言うことです。言葉を変えているならば、

物事を順序だてて考えることができるということです。

具体的には、「プログラムを組み立てる」という、行為に上に挙げた事が必要なので、身につくといううわけです。

コードを書く

プログラミングの初めは、真似から入ります。古い人は、このことを「写経」といいます。

でわ、早速、初めてのコードを写経しましょう。

ハローワールド

プログラムに限らず創造は模倣に始まるという様に、はじめに動かす決まった形のプログラムがあります。
俗に言う「ハローワールド」というプログラムです。コンソール(コマンドプロンプトやターミナル)に出力するものですが、今回はJavaFxでやります。

Hello Java Fx

とりあえずは、プログラムの構成イメージ図を作ってみました。

Java Fxのアプリケーションクラスの上にシーンが、クラス・コンテナ(Map)に登録されていて、切り替えが出来るような物を作ります。
※図の作成はDrawExpressを使用しました。

とりあえず、以下のリンクも参考にどうぞ

開発手順〜プロジェクトの作成〜

Eclipseでの開発は、以下の通りです。

  1. まずプロジェクトを作成します。
  2. そして、作成したプロジェクトで使用するJDK(JREライブラリ)をJava1.8に修正します。

Lv1.ハローワールド

HelloWorldをやります。とりあえずコードは下のようになります。

package jp.zenryoku.fx;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;
/**
* JavaFXでのハローワールド〜OpenCVなどの
* 作成したアプリをテストするための、スタンドアロンアプリ。
* 
* @author takunoji
* 2019/01/23
*/
public class RootFxMain extends Application {
    /** 画面の縦幅 */
    private double VIEW_HEIGHT;
    /** 画面の横幅 */
    private double VIEW_WIDTH;
    /**
    * 親クラスのメソッドをオーバーライドする。
    * 画面を作成したり、シーンを作成したり、色々。。。
    * 
    * @see javafx.application.Application#start(javafx.stage.Stage)
    */
    @Override
    public void start(Stage primaryStage) throws Exception {
        // Stageの設定
        primaryStage.setHeight(VIEW_HEIGHT);
        primaryStage.setWidth(VIEW_WIDTH);
        // ラベルの設定
        Label label = new Label();
        // ペインの作成
        Group root = new Group();
        root.getChildren().add(label);
        // シーンの作成
        Scene scene = new Scene(root, VIEW_WIDTH, VIEW_HEIGHT);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    /**
    * メインメソッド
    * @param args プログラム引数
    */
    public static void main(String[] args) {
        // 親クラスのメソッドを呼び出す、これは上のstart()を呼び出す。
        launch();
    }
}

起動すると、下のような感じで表示されます。

真っ白な部分がこのJavaFXで作られた画面になります。

初めのプログラムを書くためのスペース(領域)を作成する必要があります。

なので下のメソッドを1つ追加します。

/**
* JavaFX版のハローワールド実装用のメソッドになります。
* @return 画面に出力する文字列
*/
public String myFirstProgram() {
    String hyoji = "Hello World";
    return hyoji;
}

そして、上の「start」メソッドに下の2行を追加します。

// ハローワールドを出力する
label.setText(myFirstProgram());
label.setFont(new Font("RobotRegular", 24));

実行結果:作成したコードはこちら(GIT)

ちょっとかけ離れているかもですが、一応、OpenCVでのテストを行う準備も含めています。。。

追記

この次からの記事もそうですが

「初めてでも大丈夫」じゃなかったかも?

ちょいと自分の書いた記事を見直してみたところ、途中の過程が抜けているように思いました。そーすると「初めてでは危うい」と思いましたので
次回からは、オラクルのチュートリアルを進める方向で行ってみようと思います。

 

でわでわ。。。

>>> 次へ

関連ページ

※ラジオボタンでページのリンクが表示されます。