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

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

ただいまの
回答率

90.51%

  • Java

    15834questions

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

javaで次の画面に値を渡す方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,058

sobue

score 191

package games;

import java.util.ArrayList;
import java.util.List;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.FlowPane;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class Games extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        // TODO 自動生成されたメソッド・スタブ

        // フレームのプロパティの設定
        primaryStage.setTitle("Games");
        primaryStage.setWidth(400);
        primaryStage.setHeight(300);
//        primaryStage.initModality(Modality.APPLICATION_MODAL);
        // パネルのプロパティ設定
        FlowPane fp = new FlowPane(10, 10);
        fp.setPadding(new Insets(10, 10, 10, 10));

        // ボタンをフォームに追加する
        for (Button btn : buttonList()) {
            btn.setPrefWidth(150);
            fp.getChildren().add(btn);
        }

        Scene scene = new Scene(fp);

        primaryStage.setScene(scene);
        // フレームの表示
        primaryStage.show();
    }

    /**
     * ボタンリスト生成
     * 
     * @return
     */
    public List<Button> buttonList() {

        List<Button> btnList = new ArrayList<Button>();

        // フラッシュ暗算
        Button btnFlash = new Button("フラッシュ暗算");
        btnFlash.setOnAction(new FlashButtonEvent());
        btnList.add(btnFlash);

        // ブロック崩し
        Button btnBlock = new Button("ブロック崩し");
        btnList.add(btnBlock);

        // テトリス
        Button btnTetris = new Button("テトリス");
        btnList.add(btnTetris);

        // ピクロス
        Button btnPicross = new Button("ピクロス");
        btnList.add(btnPicross);

        // スペースインベーダー
        Button btnInvaders = new Button("スペースインベーダー");
        btnList.add(btnInvaders);

        // リバーシ
        Button btnReverse = new Button("リバーシ");
        btnList.add(btnReverse);

        return btnList;

    }

    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        Application.launch(args);
    }
}
package games;

import java.util.HashMap;
import java.util.Map;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class FlashButtonEvent implements EventHandler<ActionEvent> {

    @Override
    public void handle(ActionEvent event) {
        // TODO 自動生成されたメソッド・スタブ
        // 新しいウインドウを生成
        Stage newStage = new Stage();
        newStage.setWidth(520);
        newStage.setResizable(false);

        // モーダルでWindowを表示する(前のWindowは操作できないようにする)
        newStage.initModality(Modality.APPLICATION_MODAL);

        FlowPane fp1 = new FlowPane(10, 10);
        fp1.setPadding(new Insets(10, 10, 10, 10));

        Label label1 = new Label("   出てくる桁数");
        TextField textDigits1 = new TextField();
        Label label2 = new Label("おすすめ桁数:1〜3");
        fp1.getChildren().add(label1);
        fp1.getChildren().add(textDigits1);
        fp1.getChildren().add(label2);

        Label label3 = new Label("数字の出ている時間");
        TextField textDigits2 = new TextField();
        Label label4 = new Label("おすすめ時間:0.5秒〜1秒");

        fp1.getChildren().add(label3);
        fp1.getChildren().add(textDigits2);
        fp1.getChildren().add(label4);

        Label label5 = new Label("     計算回数");
        TextField textDigits3 = new TextField();
        Label label6 = new Label("おすすめ回数:1〜5回");
        fp1.getChildren().add(label5);
        fp1.getChildren().add(textDigits3);
        fp1.getChildren().add(label6);

        Label label7 = new Label("     計算方法");
        ComboBox<String> cmbCalc = new ComboBox<String>();

        String[] data = { "+", "ー", "×", "÷", "ランダム" };
        cmbCalc.getItems().addAll(data);
        // コンボボックスに最初のデータを表示させておく
        cmbCalc.setValue(data[0]);

        fp1.getChildren().add(label7);
        fp1.getChildren().add(cmbCalc);

        Button btnConfig = new Button("設定完了");
        btnConfig.setOnAction(new FlashCalc(1, 1, 1));

        Button btnClose = new Button("閉じる");
        btnClose.setOnAction((ActionEvent) -> newStage.close());

        fp1.getChildren().add(btnConfig);
        fp1.getChildren().add(btnClose);

        Scene scene1 = new Scene(fp1);
        newStage.setScene(scene1);

        // 新しいウインドウを表示
        newStage.show();
    }
package games;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.FlowPane;
import javafx.scene.text.Font;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class FlashCalc implements EventHandler<ActionEvent> {

    private int test;

    FlashCalc(int keta, int kaisu, int jikan) {
        test = keta;
    }

    @Override
    public void handle(ActionEvent event) {
        // TODO 自動生成されたメソッド・スタブ

        Stage stage = new Stage();
        stage.initModality(Modality.APPLICATION_MODAL);

        FlowPane fPane = new FlowPane();

        Label lblNumber = new Label(String.valueOf(test));
        lblNumber.setFont(Font.font(70));

        fPane.getChildren().add(lblNumber);

        Scene scene = new Scene(fPane);

        stage.setScene(scene);

        stage.show();
    }

}


上記のコードで次の画面に値を渡すことは可能ですが、値が渡っててほしい2つ前の画面で値を意識しなければならず思うように値を渡せません。FlashCalcのクラスでコンストラクタの引数をIntegerにしておけばエラーにはならないですが、どのように値を渡したらいいかがわかりません。
お手数おかけしますが、ご教示お願いします。

追記 やりたいこと
質問の内容が不足していて申し訳ありません。フラッシュ暗算ボタンを押したらフラッシュ暗算の設定画面が出てきて設定ボタンを押したらその設定条件を次の画面へ持って行く処理をしたいです。現在は苦し紛れにbtnConfig.setOnAction(new FlashCalc(1, 1, 1));
と記述しています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • akabee

    2017/04/22 23:13 編集

    理想としてどのような動作がしたくて、その観点で見たときにこのコードのどこが問題なのかを教えて下さい。初期画面があり、その中の1つのボタンを押したら多分FlashCalcが実行されて、その引数が1,1,1となっていますが、それがやむを得ず入れた値で、そうではなく理想としてやりたい動作があるのだろうと予想しています。

    キャンセル

  • sobue

    2017/04/23 11:16

    質問内容に追加しました

    キャンセル

回答 1

checkベストアンサー

+1

質問者さんの画面遷移の考え方ですが、ボタンのイベントハンドラーを設定する際にイベントハンドラーのコンストラクターに情報を渡そうとしても入力された値がFlashCalc画面には渡せないことになりますね。それが質問者さんが感じておられる問題と思います。

対処は次のように考えるとよいと思います。

(A) EventHandlerのコンストラクターでの情報の受け渡しはしない
(B) EventHandlerの処理本体で引き継ぎ情報を処理したり次画面へ渡したりする

(B)は言葉だけではいいにくいのですが、これは無名クラスかlambda記法(意味合いは同じです)を使うことで以外とあっさり解決できます。下記のコードの「---ここがポイント---」のところをご覧ください。

一部のみコードを書いてみます。なお、JavaFXなので無名クラスではなくlambda記法を使っています。

public class Games extends Application {
    ...
    btnFlash.setOnAction(ev -> {
      new FlashCalcConfigurationController().start();
    });
    ...
}

public class FlashCalcConfigurationController {
  void start() {
    Stage stage = new Stage(...);
    ...
    final TextField textDigits1 = new TextField(...);
    final TextField textDigits2 = new TextField(...);
    final TextField textDigits3 = new TextField(...);
    ...
    Button btnConfig = new Button("設定完了");
    btnConfig.setOnAction(ev -> {
      try {
        // ----------------ここがポイント---------------------
        // 以下のようにstartメソッドの中にあるfinalなローカル変数にアクセスできます。
        // (FlashCalcConfigurationControllerのフィールドにもアクセス可)
        int keta = Integer.paserInt(textDigits1.getText());
        int jikan = Integer.parseInt(textDigits2.getText());
        int kaisu = Integer.paserInt(textDigits3.getText());
        new FlashCalc().start(keta, kaisu, jikan);
      } catch (NumberFormatException e) {
        ;
      }
    });
    ...
    stage.show();
  }
}

public class FlashCalc implements EventHandler<ActionEvent> {
  int keta;
  int kaisu;
  int jikan;

  void start(int keta, int kaisu, double jikan) {
    Stage stage = new Stage(...);
    ...
    stage.show();
  }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/06 08:04

    評価が遅れて申し訳ありません。やりたいことはできました。
    (B)についても自分でコードを書いてみたら意味がわかりました。
    ずっと悩んでいたところなので助かりました。ありがとうございます。

    キャンセル

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

  • Java

    15834questions

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