Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜

イントロダクション

前回は、画面切り替え用のボタンを作成しました。

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

現状(2019/01/27)としては、ボタンを押下しても何も動きません。なのでこの動き「イベント処理」を実装するというのが今回の趣旨です。

イベントの実装方法

イベント処理の実装方法としては、細かい話をすると結構な量になるので「やり方」から入ろうと思います。今後、その細かいところも記載いたします。

[参考サイト]

Oracleのチュートリアル

イベント(アクション)実装

ズバリこんな風に作りました。説明が足りませんで。。。

  1. 画面上に、ボタンを作成します。これが「viewChangeBtn」変数にセットされています。
  2. このボタンに「キーが推されたときの処理をセットする」メソッド「setOnKeyPressed」をしようしてその処理を書きます。
  3. 「XXXされたとき」のような処理のことを「イベント処理」といい、EventHandlerインターフェースを実装します。
  4. EventHandlerインターフェースは、処理の内容が実装されていないのでそれを実装する必要があります。この時に実装しなくてはいけないのがインターフェースに定義されているメソッドです。
  5. インタフェースは処理内容が定義されていませんが。implements(実装)するときに定義されているメソッドをオーバーライドしてやる必要があります。「@Override」がついているメソッドがオーバーライドしているメソッドになります。
  6. そして、作成したボタンをPrimaryステージクラスに追加してやれば表示できます。
Button viewChangeBtn = new Button("画面切り替え");
viewChangeBtn.setOnKeyPressed(new EventHandler() {
    @Override
    public void handle(KeyEvent event) {
                // テスト用のコード
        System.out.println(event.getText());
    }
});

そして実行

ボタンを押下すると「ボタンの文字」がコンソールに出力されるはずなのですが、なにもでない。。。

ちょっと画面をいじってみると「ボタンを選択してからPCのキーボードを叩くと」コンソールに文字が出力されました。

KeyEventではなく、ActionEventの方を使うのが正しい実装でした。

<ソースの修正>

Button viewChangeBtn = new Button("画面切り替え");
viewChangeBtn.setOnAction(event -> {
    System.out.println(event.getEventType());
});

KeyEventと ActionEventで少し実装方法が違います。そして動かしてみる!

こんな感じでコンソールに出力されました。これでボタンに対するイベント(アクション)処理は実装できました。次回は、ボタン押下時に画面を切り替える方向に実装部分を修正します。

JavaFX ボタンのアクション〜イベント処理の実装方法ワンポイントレッスン的な〜

ボタンを押下した時の実装方法

Button viewChangeBtn = new Button("画面切り替え");
viewChangeBtn.setOnKeyPressed(new EventHandler() {
	@Override
	public void handle(KeyEvent event) {
            // イベント処理
	}
});

<注意>

インポートする時に「javafx.scene.input.KeyEvent」ではないawtなどにあるKeyEventをインポートするとビルドエラーが出る。

JavaFXでのボタン関連チュートリアル

[rakuten ids="nakayama-shiki:10000103"]









Java インターフェース〜Mapの使い方 ワンポイントレッスン的な〜

Mapインターフェース

Mapインターフェースはキーと値をセットにして使用するクラスです(インターフェースクラス)
Listインターフェースと同じように、MapインターフェースをimplementsしているクラスをMap型の変数で扱うことができます。

JSなどで「連想配列」などと呼ばれているものと似ています。しかし別物です。使い方は、putメソッドで値をセット、getメソッドで取得するといった形で使用します。下の動画は、Mapインターフェースの使い方を実行してみたものです。

コードはこんな感じです。

        Map<String, Integer>

        hashMap = new HashMap<String, Integer>();
        hashMap.put("C", new Integer(3));
        hashMap.put("B", new Integer(2));
        hashMap.put("A", new Integer(1));
        hashMap.forEach(new BiConsumer<String, Integer>() {
                @Override
                public void accept(String t, Integer u) {
                    System.out.println("Key: "+ t + " / Value: " + u);
            }
        });

        Map<String, Integer> linkedMap = new TreeMap<String, Integer>();
        linkedMap.put("C", new Integer(3));
        linkedMap.put("B", new Integer(2));
        linkedMap.put("A", new Integer(1));
        linkedMap.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String t, Integer u) {
                System.out.println("Key: "+ t + " / Value: " + u);
            }
        });

<実行結果>

Key: A / Value: 1
Key: B / Value: 2
Key: C / Value: 3
Key: A / Value: 1
Key: B / Value: 2
Key: C / Value: 3

昔のMapでは、HashMapの場合はソートせず、TreeMapはコレクション・フレームワーク側でソート(並べ替え)をしてくれていたんだけど、今はHashMapもソートしてくれるようで。。。

ほぼ違いがない、

<ポイント>

Map<キー, 値>で宣言します。キーと値をセットして取り出したり登録したり。。。こんな感じで使用します。Gitにソースをアップしています。

Mapインターフェースの実装クラスの一つ「」の操作を行ってみました。Hashtableクラスの実装でもあります。

Java インターフェース 〜Listの使い方、ワンポイントレッスン的な〜

イントロダクション

Javaの場合、インターフェースはよく使うもので「List」と「Map」があります。

<List>

<Map>

Listインターフェース

インターフェースは実体を持たないクラスです。。。と記載しても意味がわからないと思います。コードで語りましょう。

public static void main(String[] args) {
  /* 配列(String[]型)のリストList<E>の
   * Eはエレメント(要素)で実際はなんでも良い
   */
  List<String> list1 = new ArrayList<String>();
  // 要素を順番に登録するLinkさせてリストを作ります。
  List<String> list2 = new LinkedList<String>();
}

正直、LinkedListをうまく説明できていないと思います。現状ではとりあえず『「ArrayList」と違うんだな!』と理解していただければ。。。

ArrayListLinkedListを比較してみましたが、結果は変わりませんでした。


テスト実行したソースはGitにアップしました。

早い話

インターフェース(List)を実装しているクラスは全く関係のないクラスだったとしてもListとして使用できるということです。
※実際には、オーバーライドしなくてはいけないメソッドがあるので、処理内容が限定されます。

処理スピードが違うという噂を聞きましたが、この違いは大量データを厚勝つ時にはList, MapよりもHashTableを使用する方が良いと思っているので、考えたことがありませんです。。。

サンプルコード:ArrayList

Listインターフェースをimplementsしているので下のように書くことができる

    @Test
    public void testAdd() {
        List<String> list = new ArrayList<>();
        list.add("その1");
        list.add("その2");
        list.add("その3");
        list.add("その4");

        for (String st : list) {
            System.out.println(st);
        }
    }

サンプルコード:LinkedList

Listインターフェースをimplementsしているので、newするクラスが別でも、同じメソッドを呼び出すことができる。

    @Test
    public void testAddFirst() {
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        list.forEach(System.out::println);
    }

Java クラスの書き方〜ワンポイントレッスン的な〜

ズバリ、このように書きます。

ポイントとしては、クラスの要素としても照るのは次のものであります。

  1. フィールド(変数)
  2. メソッド

そして、メインメソッドはstaticがついているので通常のメソッド(インスタンスメソッド)と扱いが違います。
名前の通り、インスタンスメソッドはインスタンス化しないと呼び出せません。

// staticの呼び出し方
クラス名.メソッド名();
// インスタンスメソッドの呼び出し方
クラス名 hensu = new クラス名();
hensu.メソッド名();
/**
 * クラスのJavaDocの記載をするスペース
 */
public class クラス名 {
   /** フィールド変数 */
   public String field;

  /**
   * メソッドのJavaDo記載スペース
   */
   public static void main(String[] args) {
     // コメント
     System.out.println("Hello World");
     // 変数の宣言
     int num;
     // 変数の初期化(宣言して、値を代入している)
     int suji = 1;
     /*
      * 複数行のコメント
      * 「/**」で始まる場合はJavaDocなので注意
      * 下の「for」で始まるコードはループ文です。
      * 俗にいう「forループ」
      */
      for (int i = 0; i < 10; i++) {
         suji += i;
      }
  }
}

※実際にはEclipseやコマンドプロンプトで「javadoc」コマンドを実行してOracleのホームページにあるようなJavaDocを出力します。

クラスの書き方詳細に関しては以下のリンクを参照してください。

クラスの書き方

動画でやって見ました。

関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜