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

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

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

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

Q&A

解決済

2回答

3617閲覧

javafx メソッドの引数としてのstage

vetom

総合スコア8

JavaFX

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

0グッド

1クリップ

投稿2017/09/28 15:32

ある参考書のコードです。

java

1import javafx.application.Application; 2import javafx.geometry.Insets; 3import javafx.geometry.Pos; 4import javafx.scene.Scene; 5import javafx.scene.control.Button; 6import javafx.scene.control.Label; 7import javafx.scene.control.TextField; 8import javafx.scene.layout.HBox; 9import javafx.scene.layout.VBox; 10import javafx.stage.Stage; 11 12public class aaaa extends Application { 13 14 public static void main(String[] args) { 15 launch(args); 16 } 17 18 TextField textFieldH = new TextField(); 19 TextField textFieldW = new TextField(); 20 Label lblBMI = new Label("BMI"); 21 22 @Override 23 public void start(Stage stage) throws Exception { 24 25 stage.setTitle("BMI"); 26 stage.setWidth(200); 27 stage.setHeight(155); 28 29 Label lblH = new Label(" 身長(cm):"); 30 textFieldH.setPrefWidth(80); 31 32 HBox boxH = new HBox(); 33 boxH.getChildren().addAll(lblH, textFieldH); 34 35 36 Label lblW = new Label(" 体重(kg):"); 37 textFieldW.setPrefWidth(80); 38 39 HBox boxW = new HBox(); 40 boxW.getChildren().addAll(lblW, textFieldW); 41 42 43 Button btnGo = new Button("計算"); 44 btnGo.setOnMouseClicked(event -> updateValue(stage)); 45 46 VBox root = new VBox(); 47 root.setAlignment(Pos.TOP_CENTER); 48 root.setPadding(new Insets(5, 5, 5, 5)); 49 root.setSpacing(5.0); 50 root.getChildren().addAll(boxH, boxW, btnGo, lblBMI); 51 52 stage.setScene(new Scene(root)); 53 stage.show(); 54 } 55 56 void updateValue(Stage stage) 57 { 58 String sh = textFieldH.getText(); 59 String sw = textFieldW.getText(); 60 double h = Double.parseDouble( sh.trim() ); 61 double w = Double.parseDouble( sw.trim() ); 62 double bmi = 10000.0 * w / (h * h); 63 lblBMI.setText(String.format("BMI=%5.2f", bmi)); 64 } 65}

上記が全体のコードなのですが

Java

1Button btnGo = new Button("計算"); 2    btnGo.setOnMouseClicked(event -> updateValue(stage));

Java

1void updateValue(Stage stage) 2 { 3 String sh = textFieldH.getText(); 4 String sw = textFieldW.getText(); 5 double h = Double.parseDouble( sh.trim() ); 6 double w = Double.parseDouble( sw.trim() ); 7 double bmi = 10000.0 * w / (h * h); 8 lblBMI.setText(String.format("BMI=%5.2f", bmi));

のコードでstageが引数として使われている理由がわかりません。
一応、

Java

1Button btnGo = new Button("計算"); 2    btnGo.setOnMouseClicked(event -> updateValue());

Java

1void updateValue() 2 { 3 String sh = textFieldH.getText(); 4 String sw = textFieldW.getText(); 5 double h = Double.parseDouble( sh.trim() ); 6 double w = Double.parseDouble( sw.trim() ); 7 double bmi = 10000.0 * w / (h * h); 8 lblBMI.setText(String.format("BMI=%5.2f", bmi));

としてコンパイル、実行してみたのですが、問題なく意図した動きをしてくれました。
なぜstageが引数として使われていたのか、その意図は何かがわかりませんでした。

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

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

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

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

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

guest

回答2

0

ベストアンサー

あなたの察しの通り、そのコードでstageを引数に持つことは**「なんの意味もない」**です。

なぜその引数があるかというのは、その参考書を編集した人にしか意図はわからないですが、予想で書きます。

  • もともとはstageを使った処理を書いていたが、編集段階で削除され、引数だけ消し忘れた
  • 後々のページでstageを使った処理を書くために、最初から書いてある

の2つが考えられます。

投稿2017/09/29 01:36

masaya_ohashi

総合スコア9206

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

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

vetom

2017/09/29 03:55

やっぱりそうですよね。 このコードはこれで完成形みたいなので後々にこれを発展させていくみたいなものはありませんでした。 細かいところですが、参考書なのですべてに意図があると思い深く悩んでいました。 あってもいいけどあえてなぜ書くのかと。 分かりやすく教えていただきありがとうございます。
masaya_ohashi

2017/09/29 03:59

もし気になるならその参考書の出版に誤植の指摘として報告してあげると次の版で直されるかもしれません。合理的な理由は見当たらないので、おそらくただの誤植でしょう。
guest

0

解決済みへのコメントで恐縮ですが・・・

自分もmasaya_ohashiさんコメントと同様の印象を持ちましたが、参考書の他の部分と関連がない単独の完成コードだとして、著者があえてこのようなインターフェースにした(そうなのかどうかは分かりませんが)と仮定してその理由を考えてみました。

JavaFXの参考書の対象読者はJavaFXだけでなくJavaの学習中の人も含まれるだろうと思います。そうした読者がサンプルをベースに「ちょっと違うものを作ってみる」ということはよくあるだろうと思います。

そういう場面ではこのコードは「何かのコントロールを操作した際に、画面を更新するための一般形」として利用できます。

読者がコードを変形する際に、「サンプルとは違うコントロール(あるいはノード)」を追加する際には、サンプルに書かれているようにaaaaクラスにコントロール用のフィールドを追記するというやりかたが簡単に想像つくでしょう。

一方、「画面を動かす」などのことをやろうとするとき、Stageのインスタンスが必要になりますね。Java言語の理解が一定以上の読者なら「startメソッドの引数に初期画面のStageが渡されているのだから、ハンドラーのラムダ式の本体で引数のstageを参照できる=>ハンドラーメソッドの引数としてわたせばいい」ということは容易に考えられますが、Java自体の初学者の場合は「どうやってupdateValueの中でStageを求めたらいいのだろう」なんて迷うかも知れません。

自分は「そういう読者に向けてのちょっとした配慮」なのかも知れないと想像しました。

(尤も、これは考えすぎかも知れません。こういう配慮を意図しているなら参考書本文にそれらしい補足をするでしょうし。)

投稿2017/09/29 11:01

KSwordOfHaste

総合スコア18394

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

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

vetom

2017/09/29 11:59

KSwordOfHaste先生 いつもありがとうございます。 確かにこのサンプルベースに違うものを作ったときに引数stageは必要でしたが、そのためにあるとまでは想像つきませんでした。 >>一方、「画面を動かす」などのことをやろうとするとき、Stageのインスタンスが必要になりますね。Java言語の理解が一定以上の読者なら「startメソッドの引数に初期画面のStageが渡されているのだから、ハンドラーのラムダ式の本体で引数のstageを参照できる=>ハンドラーメソッドの引数としてわたせばいい」ということは容易に考えられますが、Java自体の初学者の場合は「どうやってupdateValueの中でStageを求めたらいいのだろう」なんて迷うかも知れません。>> この部分は正直完璧に理解できませんが、ある程度勉強が追い付いたらまた見てみます。
vetom

2017/09/29 12:05

ちなみに前回の質問で体系的に勉強したほうがいいとアドバイスしてくださったので、pc-brainという会社のjavaを受けてみることにしました。勉強するなら書きながらすぐ上級者に添削してもらった方が近道というのネットで見かけたので教材+いつでも質問okのこの教材を選びました。 本を買って、分からないことをこのようなサイトで聞けばいいのかとも思いましたが、何となくこのようなサイトの意図される使い方ではないと思ったので(レベルが低すぎて)。 それでも自作のコードなど、いろんな意見を聞きたいときはまた質問させてください。
KSwordOfHaste

2017/09/29 22:41

漠然とした質問は本サイトでは歓迎されませんが、「自分なりに調べる」「疑問点が具体的で、かつ何を知りたいかが明記されている」といったものなら歓迎されると思います。質問の内容のレベルが高いか低いかよりも前述のようなことが肝心だろうと思います。という意味では本件は悪くない質問と思います。 ちなみに「~先生」は勘弁してください。自分だって本サイトで勉強させてもらっている一人であって、ただの一アマチュアに過ぎません。普通に「~さん」でお願いします。
vetom

2017/09/30 00:48

配慮なくすみません。気分を害されていたら申し訳ないです。 教えてもらっている人に、先生を呼ぶのが自分の中で当たり前だったもので。 また宜しくお願いします。
KSwordOfHaste

2017/09/30 01:00

気分を害したわけではないですのでご心配なく。わかっていただければOKです。
masaya_ohashi

2017/10/02 01:17

余談ですが、本当は引数でstageを渡して操作するのが設計として美しいとはわかっていても、私はついつい((Stage)node.getScene().getWindow())を使ってしまう駄目なやつです…
KSwordOfHaste

2017/10/02 02:35

うーん・・・実のところ、JavaFXのより一般的なクラス構成(普通のInitializableなコントローラークラスがある)であれば、自分もmasaya_ohashiさんのおっしゃる手段がベターと思います。コントローラークラスのメソッド引数にビューのウィンドウ(=Stage)があるのは「簡単に求まるものをわざわざ渡している」感がすごくしますよね。 そう考えればStageをstartメソッド以外で積極的に引数として渡す機会は少なそうなので、自分の回答のような意図を著者さんが想定している可能性は薄そうですね・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問