JavaFX チュートリアル〜今度こそ、初めてでも大丈夫3:Button〜

イントロダクション

以前記載した記事で「初めてでも大丈夫」などと記載していましたが、ちょっと「危ういな」と思いチュートリアルをやってみようとなりました。

今回は、ボタンの表示をやります。

チュートリアル

ここのページを、戦国Xサラの要領でガンガン斬り伏せながらやっていきます。

<チュートリアル>

JavaFXを使用して作成した画面の再生リストです。サンプル動画が複数あるので、参考にどうぞ。

基本のコード

public class Lv2_Button extends Application {

    /**
     * このメソッドは、Applicationクラス(JavaFXのフレームワーク部品)
     * のメソッドをオーバーライドする。
     * {@link Application#launch(String...)}から呼び出される。
     */
    @Override
    public void start(Stage primaryStage) throws Exception {
        // チュートリアルには省略されている部分
        Group group = new Group();
        // この部分がチュートリアルに記載されている。

        // Fontを使用する方法
        Label label1 = new Label();
        label1.setFont(new Font("Aeial", 30));
        label1.setText("Text1");
        label1.setTranslateX(60);
        label1.setTranslateY(60);

        // 回転させる
        label1.setRotate(-45.0);

        // ボタンを追加する
        Button btn = new Button();

        // 上のコンポーネント(Labelとか、イメージとか)
        group.getChildren().addAll(label1, btn);
        // チュートリアルでは省略されている
        Scene scene = new Scene(group, 300, 300);
        primaryStage.setScene(scene);
        primaryStage.setTitle("チュートリアル1");
        primaryStage.show();
    }

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

このコードの実行結果

ちょっとわかりずらいけど、左端にボタンがあります。ボタンかどうかも怪しい感じです。ボタンだとわかるようにします。下の様にコードを修正します。

// ボタンを追加する
Button btn = new Button("ボタン");

ボタンが表示されました。しかし位置が悪い。。。

ソースを以下の様に追加修正します。

// ボタンを追加する
Button btn = new Button("ボタン");
btn.setLayoutX(100.0);
btn.setLayoutY(120.0);

やっぱりなんか微妙だけどまぁよし!ボタンを作成した(new Button())の行の下にあるコードは、Labelクラスでも使用したメソッドと同じ名前です。「setLayout?()」?の部分に「X」「Y」が入りそれぞれの位置を指定します。

アイコンの追加

さらにコードを修正します。

// イメージファイルの読み込み
Image img = new Image(
    this.getClass().getResourceAsStream("check.png"));
btn.setGraphic(new ImageView(img));

コードが長くなってしまった場合は、上の様にインデントをつけて(コードの開始位置をずらして)次の行にコードを書きます。そして、Imageクラスのインスタンス化(new Image())の部分はこのクラスのあるディレクトリ(フォルダ)と同じ場所にあるcheck.pngファイルを読み込んでいます。起動しているのは「Lv2_Button」クラスです。

そして、ボタンにイメージを追加しています。btn.setGraphic(new ImageView(img));これはImageViewクラスはNodeクラスを継承している(親子関係があるけど、Imageクラスにはないのでbtn.setGraphic(Node);の形位に遭わないためこの様に処理をしています。詳しくはJavaDocを参照されたし。。。

追伸:ButtonクラスはNodeクラスを継承しているので「setGraphic()」はNodeクラスのメソッドですがButtonクラスでも使用できます。この部分はおいおい理解していきましょう。

そして実行結果、よくみるとアイコンに余計な部分も入っています。元になるcheck.pngファイルをちゃんと加工していないのでこの様になります。

アクションの割り当て

アクション→ボタンを押下した時の処理を実装します。追加するコードは以下の様になります。

// アクションの追加
btn.setOnAction(event -> {
    label1.setRotate(label1.getRotate() + 15.0);
});

https://youtu.be/wa1vSVXjn5k

チュートリアルにはスタイルの指定もありましたが、ちょいと飛ばしてしまおうと思います。。。

でわでわ。。。

JavaFX チュートリアル〜今度こそ、初めてでも大丈夫2:Label〜

イントロダクション

以前記載した記事で「初めてでも大丈夫」などと記載していましたが、ちょっと「危ういな」と思いチュートリアルをやってみようとなりました。

初心者向けというのもあり、以下の手順で進めやすいように作ったつもりです。

  1. 基本のコードを写経(書き写すこと)する
  2. 写経したコードを動かす
  3. XXXを修正してXXXする
  4. 起動確認
  5. ソースの意味を理解

こんな感じで進めると分かりやすいと思います。

前回はラベルを表示しました。そして今回もラベルを表示します。ただし

回転したり大きくしたりします

チュートリアル

ここのページを、戦国Xサラの要領でガンガン斬り伏せながらやっていきます。

<Oracleのチュートリアル>

基本のコード

public class Lv1_Label2 extends Application {
    /**
    * このメソッドは、Applicationクラス(JavaFXのフレームワーク部品)
    * のメソッドをオーバーライドする。
    * {@link Application#launch(String...)}から呼び出される。
    */
    @Override
    public void start(Stage primaryStage) throws Exception {
        // チュートリアルには省略されている部分
        Group group = new Group();
        // この部分がチュートリアルに記載されている。
        // Fontを使用する方法
        Label label1 = new Label();
        label1.setFont(new Font("Aeial", 30));
        label1.setText("Text1");
        group.getChildren().add(label1);
        // チュートリアルでは省略されている
        Scene scene = new Scene(group, 300, 300);
        primaryStage.setScene(scene);
        primaryStage.setTitle("チュートリアル1");
        primaryStage.show();
    }
    /**
    * メインメソッド。
    * Apllicationクラスのlaunchメソッドを呼び出す。
    *
    * @param args プログラム引数
    */
    public static void main(String[] args) {
        launch(args);
    }
}

これだけで起動すると下のように表示されます。

そして上のコードに3行追加します。

// 位置を指定する
label1.setTranslateX(60);
label1.setTranslateY(60);
// 回転させる
label1.setRotate(45.0);

すると下のように表示されます。

setTranslateX(表示するX座標)とsetTranslateY(表示するY座標)を指定することでテキストの表示する位置を変更します。

表示する画面の左上の端が(0, 0)になります。なのでテキストの中心位置が(60, 60) かつ、角度が45度下に下がった状態で画面上に表示されています。

試しに「45」を「-45」に変更してみます。

上のようになりました。そのほかにもいじってみると表示結果が変わります。

大きくする

基本のコードに下の行を追加します。

label1.setScaleX(1.5);
label1.setScaleY(1.5);

実行結果はこんな感じです。

ラベルが見切れてしまいました。なので下のコードでテキストの位置をずらします。

label1.setLayoutX(20.0); // Xを20右に移動
label1.setLayoutY(30.0); // Yを30下に下げる

とりあえず今回は、ここで終わりにします。

でわでわ。。。

[<<<前回](https://zenryokuservice.com/wp/2019/03/03/javafx-%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%e3%80%9c%e4%bb%8a%e5%ba%a6%e3%81%93%e3%81%9d%e3%80%81%e5%88%9d%e3%82%81%e3%81%a6%e3%81%a7%e3%82%82%e5%a4%a7%e4%b8%88%e5%a4%ab/) [次回>>>](https://zenryokuservice.com/wp/2019/03/05/javafx-%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%e3%80%9c%e4%bb%8a%e5%ba%a6%e3%81%93%e3%81%9d%e3%80%81%e5%88%9d%e3%82%81%e3%81%a6%e3%81%a7%e3%82%82%e5%a4%a7%e4%b8%88%e5%a4%ab3/)

JavaFX チュートリアル〜今度こそ、初めてでも大丈夫:Label〜

イントロダクション

以前記載した記事で「初めてでも大丈夫」などと記載していましたが、ちょっと「危ういな」と思い、今回の「チュートリアルをやってみよう」となりました。

結論から言うと「書いて」「動かして」「ソースを理解」すればそれでOKです。「忘れた」とか「覚えていない」と言うのは「どこにやり方があったか?」を覚えておけば、やり方を引き出す方法が分かっていればOK!そう言う意味でJavaDocは最良の資料と言えると思います。

ところで、Oracleのチュートリアルでは、下のような木琴を使ったデモアプリがありますのでそれを動かしてみるのも面白いと思います。

JavaFXチュートリアル

ここのページを、戦国Xサラの要領でガンガン斬り伏せながらやっていきます。下のチュートリアル(OracleDoc)をやって行きます。

<チュートリアル>

Lv1. ラベル(JavaFXの書き方)

ラベル表示は初めの HelloWorldでやったのですが、ちょいと、やり直します。

基本のコード

<ソースコード>

/**
 * OracleのJavaFXチュートリアル。
 * Labelクラスで「Hello World」
 * JavaDocです。このクラスは「@see」に記載しているサイトの
 * チュートリアルをやります。このクラスではLabelクラスの使用法を実行します。
 * 
 * @author takunoji
 * @see https://docs.oracle.com/javase/jp/8/javafx/user-interface-tutorial/label.htm#CIHHFIBJ
 * 2019/03/03
 */
 public class Lv1_Label extends Application {
    /**
      * このメソッドは、Applicationクラス(JavaFXのフレームワーク部品)
      * のメソッドをオーバーライドする。
      * {@link Application#launch(String...)}から呼び出される。
      */
      @Override
      public void start(Stage primaryStage) throws Exception {
          // チュートリアルには省略されている部分
          Group group = new Group();
          // この部分がチュートリアルに記載されている。
          Label label1 = new Label();
          Label label2 = new Label();
          Image image = new Image(this.getClass().getResourceAsStream("woodTile.png"));
          Label label3 = new Label("Search", new ImageView(image));
          // 上のコンポーネント(Labelとか、イメージとか)
          group.getChildren().addAll(label1, label2, label3);
          // チュートリアルでは省略されている
          Scene scene = new Scene(group, 300, 300);
          primaryStage.setScene(scene);
          primaryStage.setTitle("チュートリアル1");
          primaryStage.show();
      }
      /**
      * メインメソッド。
      * Apllicationクラスのlaunchメソッドを呼び出す。
      * 
      * @param args プログラム引数
      */
      public static void main(String[] args) {
          launch(args);
      }
  }
  

とりあえずコードを眺めたと思うのですが、理解しなくておっけ〜です。

ただ、Javaってやつは、とりあえず、メインメソッドが、はじめに動くという事を覚えてください。

上のコードは以下の様な処理をしています。

<処理内容>

  1. メインメソッドからApplicarionクラスの「launch()」を呼び出します。
  2. 「launch()」が起動したら「start()」が呼び出されます。
  3. 画面に表示するためのレイアウトクラス(Groupクラス)をインスタンス化
  4. コンポーネント(ラベル)を作成し、レイアウトクラス(Group)に追加
  5. レイアウトクラスをSceneクラスに設定(追加と同義)
  6. SceneをStageクラス(primaryStage)に追加
  7. Stage#show()を呼び出す。

Java Fxでは、画面(シーン(scene))にレイアウト(GroupやBorderPaneなど)を配置してコンポーネント(ラベルやボタンなど)を追加します。

  • bodyタグがStage(ステージ)
  • divタグ(一番外側)がシーン
  • 内側にあるdiv(右寄せとか)はレイアウト
  • labelやinputなどはコンポーネント

上記のプログラムも同様に

  1. ステージ(Stage)にシーンを追加、
  2. シーンへレイアウト(Group)を追加
  3. レイアウトにコンポーネントを追加

という様な事をやっています。

ちょいと長くなってしまいましたが、コーディングの動画も作成してみました。this.getClass().getResourcesAsStream()のところでちょいとつまづきました。これはこのクラスがあるディレクトリを基準にファイルなどの参照を取得します。

Lv2.ラベルにFontを設定

<Lv1の「start()」を修正しました。>※赤い字が修正ポイントです。

@Override
public void start(Stage primaryStage) throws Exception {
    // チュートリアルには省略されている部分
    Group group = new Group();
    // この部分がチュートリアルに記載されている。
    // Fontを使用する方法
    Label label1 = new Label();
       label1.setFont(new Font("Aeial", 30));
       Label label2 = new Label();
       label2.setFont(new Font("Cambria", 32));
    Image image = new Image(this.getClass().getResourceAsStream("woodTile.png"));
    Label label3 = new Label("Search", new ImageView(image));
    // 上のコンポーネント(Labelとか、イメージとか)
    group.getChildren().addAll(label1, label2, label3);
    // チュートリアルでは省略されている
    Scene scene = new Scene(group, 300, 300);
    primaryStage.setScene(scene);
    primaryStage.setTitle("チュートリアル1");
    primaryStage.show();
}

表示結果が変わりません。。。これは、3つ目のラベルが初めのラベルの上にあるためです。

<ラベルを表示しない版。>

一部修正してこんな感じにします。

// 上のコンポーネント(Labelとか、イメージとか)
group.getChildren().addAll(label1, label2/*, label3 */);

「//」が書かれた1行は「コメント」と解釈されます。

同様に「/*」「*/」で挟まれている部分もソースコードとして解釈されません。今回は後者を使いました。

ちなみにコードを実行する形にするのは「コンパイラ」の役目です。JavaのコンパイラはJDKの中に入っています。JDKはJavaを起動する為のフォルダなんだな!と理解してもらえればOK!

とりあえずは、コードを写経して、実行して「動いた!」と言う感動を味わっていただきたく思います。

でわでわ。。。

[次へ >>>](https://zenryokuservice.com/wp/2019/03/04/javafx-%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%e3%80%9c%e4%bb%8a%e5%ba%a6%e3%81%93%e3%81%9d%e3%80%81%e5%88%9d%e3%82%81%e3%81%a6%e3%81%a7%e3%82%82%e5%a4%a7%e4%b8%88%e5%a4%ab2/)