質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

2327閲覧

ボタンアクション2

GFC

総合スコア11

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/11/24 15:49

編集2016/11/29 08:58

for文で作成したボタンにアクションを付けたのですが、このプログラムだと一番最後に作成されたボタンしかアクションが反映されません。どのように改善するとよいでしょうか。
プログラミング初心者でほとんど手探りで学習しているため初歩的なことを聞いて申し訳ございません。

private void createButton() { for (int i = 0; i < a; i++) { index=i; Button[i].setOnAction(actionHandler); } Container.getChildren().add(vbox); } EventHandler<ActionEvent>actionHandler = new EventHandler<ActionEvent>(){ @Override public void handle(ActionEvent e){ for (int i = 0; i < a; i++){ if(Button[index].equals(Button[i])){ 画面遷移; } } } };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2016/11/24 16:24

字下げがおかしいと閲覧者がコードを見るのに手間どります。適切な字下げをするようご注意ください。
GFC

2016/11/25 13:33

とりあえず字下げしてみましたが、このような感じでいいのでしょうか?
KSwordOfHaste

2016/11/25 15:56

元よりは見やすくなりました。ただ一定の字下げ幅になっていないのでベストではありませんね。字下げの文字数を4文字でも2文字でもよいので統一するのがベストだと思います。
guest

回答2

0

ベストアンサー

質問者さんのハンドラーの中身についてコメントします。ハンドラーの中でnameButtons[index]とnameButtons[i]をループで比較していることから質問者さんの意図はハンドラーの中で最初のボタンならindex=0、次のボタンならindex=1となることを期待しているはずです。しかしおそらくindexの宣言の位置が不適切なため意図通りに動作しないと思います。

意図通りにするには次のようにforループの中でindexを「finalなローカル変数として宣言」する必要があります。またハンドラーの実体はこのローカル変数indexを参照できるスコープ内(つまりループの内側)でlambda式として参照するか無名クラスとしてnewする必要があります。(おそらく質問者さんのコードはindexをフィールドにしているかforループの外にあるローカル変数として宣言していると思われます。)

java

1for (int i = 0; i < a; i++) { 2 nameButtons[i] = new Button(); 3 ... 4 int index = i; // ここでローカル変数として「宣言」することが必須 5 // (1) lambda式でハンドラーを記述する例(Java1.8以降でしか使えません) 6 nameButtons[i].setOnAction(ev -> { 7 Button actionButton = nameButtons[index]; //<-最初のボタンはindex=0,次はindex=1になります 8 ... 9 }); 10 // (2) 無名クラスでハンドラーを記述する例。(1)と同じ動作になります。 11 // Java1.8より前のバージョンではこちらの書き方になります。でもJavaFXを使っているということは 12 // 多分Java1.8をお使いだと思うので(1)を推奨します。 13 nameButtons[i].setOnAction(new EventHandler<ActionEvent>() { 14 @Override 15 public void actionPerformed(ActionEvent ev) { 16 Button actionButton = nameButtons[index]; 17 ... 18 } 19 }); 20}

さらに、ご質問のコードのハンドラー内でのループによる比較には意味がありません。なぜならループ内のif文はどのボタンでも必ずtrueになり実行されてしまうからです。ループによる比較を行わずとも何番目のボタンなのかは最初からindexに入っているはずです。

投稿2016/11/25 15:48

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GFC

2016/11/25 17:25

ありがとうございます無事解決できました。また、プログラムの字下げなどの指摘も勉強になりました。
guest

0

Java

1nameButton[i].setOnAction(actionHandler);

この部分を

Java

1nameButton[i].setOnAction(new EventHandler<ActionEvent>(){ 2 @Override 3 public void handle(ActionEvent e){ 4 for (int i = 0; i < a; i++) 5 { 6 if(nameButton[index].equals(nameButton[i])){ 7 画面遷移; 8 } 9 } 10 } 11 });

とすれば良いと思います。

質問の回答では、毎回同じオブジェクトが登録されています。
違うオブジェクトを登録する必要があります。
それぞれ、newして違うオブジェクトを作らないといけません。

投稿2016/11/24 16:44

MasashiKimura

総合スコア1150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GFC

2016/11/25 09:56

やっぱり一番最後のボタンが参照されます・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問