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

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

ただいまの
回答率

90.75%

  • JavaFX

    378questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 331

vetom

score 1

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

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class aaaa extends Application {

    public static void main(String[] args) {
        launch(args);
        }

    TextField textFieldH = new TextField();
    TextField textFieldW = new TextField();
    Label lblBMI = new Label("BMI");

    @Override
    public void start(Stage stage) throws Exception {

        stage.setTitle("BMI");
        stage.setWidth(200);
        stage.setHeight(155);

        Label lblH = new Label(" 身長(cm):");
        textFieldH.setPrefWidth(80);

        HBox boxH = new HBox();
        boxH.getChildren().addAll(lblH, textFieldH);


        Label lblW = new Label(" 体重(kg):");
        textFieldW.setPrefWidth(80);

        HBox boxW = new HBox();
        boxW.getChildren().addAll(lblW, textFieldW);


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

        VBox root = new VBox();
        root.setAlignment(Pos.TOP_CENTER);
        root.setPadding(new Insets(5, 5, 5, 5));
        root.setSpacing(5.0);
        root.getChildren().addAll(boxH, boxW, btnGo, lblBMI);

        stage.setScene(new Scene(root));
        stage.show();
    }

    void updateValue(Stage stage)
    {
        String sh = textFieldH.getText();
        String sw = textFieldW.getText();
        double h = Double.parseDouble( sh.trim() );
        double w = Double.parseDouble( sw.trim() );
        double bmi = 10000.0 * w / (h * h);
        lblBMI.setText(String.format("BMI=%5.2f", bmi));
    }
}

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

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

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

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

Button btnGo = new Button("計算");
    btnGo.setOnMouseClicked(event -> updateValue());
void updateValue()
    {
        String sh = textFieldH.getText();
        String sw = textFieldW.getText();
        double h = Double.parseDouble( sh.trim() );
        double w = Double.parseDouble( sw.trim() );
        double bmi = 10000.0 * w / (h * h);
        lblBMI.setText(String.format("BMI=%5.2f", bmi));


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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

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

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

の2つが考えられます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/29 12:55

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

    キャンセル

  • 2017/09/29 12:59

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

    キャンセル

+1

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

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/29 20:59

    KSwordOfHaste先生
    いつもありがとうございます。
    確かにこのサンプルベースに違うものを作ったときに引数stageは必要でしたが、そのためにあるとまでは想像つきませんでした。

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

    キャンセル

  • 2017/09/29 21:05

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

    キャンセル

  • 2017/09/30 07:41

    漠然とした質問は本サイトでは歓迎されませんが、「自分なりに調べる」「疑問点が具体的で、かつ何を知りたいかが明記されている」といったものなら歓迎されると思います。質問の内容のレベルが高いか低いかよりも前述のようなことが肝心だろうと思います。という意味では本件は悪くない質問と思います。

    ちなみに「~先生」は勘弁してください。自分だって本サイトで勉強させてもらっている一人であって、ただの一アマチュアに過ぎません。普通に「~さん」でお願いします。

    キャンセル

  • 2017/09/30 09:48

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

    キャンセル

  • 2017/09/30 10:00

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

    キャンセル

  • 2017/10/02 10:17

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

    キャンセル

  • 2017/10/02 11:35

    うーん・・・実のところ、JavaFXのより一般的なクラス構成(普通のInitializableなコントローラークラスがある)であれば、自分もmasaya_ohashiさんのおっしゃる手段がベターと思います。コントローラークラスのメソッド引数にビューのウィンドウ(=Stage)があるのは「簡単に求まるものをわざわざ渡している」感がすごくしますよね。

    そう考えればStageをstartメソッド以外で積極的に引数として渡す機会は少なそうなので、自分の回答のような意図を著者さんが想定している可能性は薄そうですね・・・

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaFX

    378questions

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