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

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

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

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

Q&A

解決済

1回答

8747閲覧

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

sobue

総合スコア329

Java

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

0グッド

2クリップ

投稿2017/04/22 03:43

編集2017/04/22 21:40

java

1package games; 2 3import java.util.ArrayList; 4import java.util.List; 5 6import javafx.application.Application; 7import javafx.event.ActionEvent; 8import javafx.event.EventHandler; 9import javafx.geometry.Insets; 10import javafx.scene.Scene; 11import javafx.scene.control.Button; 12import javafx.scene.layout.FlowPane; 13import javafx.stage.Modality; 14import javafx.stage.Stage; 15 16public class Games extends Application { 17 18 @Override 19 public void start(Stage primaryStage) throws Exception { 20 // TODO 自動生成されたメソッド・スタブ 21 22 // フレームのプロパティの設定 23 primaryStage.setTitle("Games"); 24 primaryStage.setWidth(400); 25 primaryStage.setHeight(300); 26// primaryStage.initModality(Modality.APPLICATION_MODAL); 27 // パネルのプロパティ設定 28 FlowPane fp = new FlowPane(10, 10); 29 fp.setPadding(new Insets(10, 10, 10, 10)); 30 31 // ボタンをフォームに追加する 32 for (Button btn : buttonList()) { 33 btn.setPrefWidth(150); 34 fp.getChildren().add(btn); 35 } 36 37 Scene scene = new Scene(fp); 38 39 primaryStage.setScene(scene); 40 // フレームの表示 41 primaryStage.show(); 42 } 43 44 /** 45 * ボタンリスト生成 46 * 47 * @return 48 */ 49 public List<Button> buttonList() { 50 51 List<Button> btnList = new ArrayList<Button>(); 52 53 // フラッシュ暗算 54 Button btnFlash = new Button("フラッシュ暗算"); 55 btnFlash.setOnAction(new FlashButtonEvent()); 56 btnList.add(btnFlash); 57 58 // ブロック崩し 59 Button btnBlock = new Button("ブロック崩し"); 60 btnList.add(btnBlock); 61 62 // テトリス 63 Button btnTetris = new Button("テトリス"); 64 btnList.add(btnTetris); 65 66 // ピクロス 67 Button btnPicross = new Button("ピクロス"); 68 btnList.add(btnPicross); 69 70 // スペースインベーダー 71 Button btnInvaders = new Button("スペースインベーダー"); 72 btnList.add(btnInvaders); 73 74 // リバーシ 75 Button btnReverse = new Button("リバーシ"); 76 btnList.add(btnReverse); 77 78 return btnList; 79 80 } 81 82 public static void main(String[] args) { 83 // TODO 自動生成されたメソッド・スタブ 84 Application.launch(args); 85 } 86} 87

java

1package games; 2 3import java.util.HashMap; 4import java.util.Map; 5 6import javafx.event.ActionEvent; 7import javafx.event.EventHandler; 8import javafx.geometry.Insets; 9import javafx.scene.Scene; 10import javafx.scene.control.Button; 11import javafx.scene.control.ComboBox; 12import javafx.scene.control.Label; 13import javafx.scene.control.TextField; 14import javafx.scene.layout.FlowPane; 15import javafx.scene.layout.HBox; 16import javafx.scene.text.Font; 17import javafx.stage.Modality; 18import javafx.stage.Stage; 19 20public class FlashButtonEvent implements EventHandler<ActionEvent> { 21 22 @Override 23 public void handle(ActionEvent event) { 24 // TODO 自動生成されたメソッド・スタブ 25 // 新しいウインドウを生成 26 Stage newStage = new Stage(); 27 newStage.setWidth(520); 28 newStage.setResizable(false); 29 30 // モーダルでWindowを表示する(前のWindowは操作できないようにする) 31 newStage.initModality(Modality.APPLICATION_MODAL); 32 33 FlowPane fp1 = new FlowPane(10, 10); 34 fp1.setPadding(new Insets(10, 10, 10, 10)); 35 36 Label label1 = new Label(" 出てくる桁数"); 37 TextField textDigits1 = new TextField(); 38 Label label2 = new Label("おすすめ桁数:1〜3"); 39 fp1.getChildren().add(label1); 40 fp1.getChildren().add(textDigits1); 41 fp1.getChildren().add(label2); 42 43 Label label3 = new Label("数字の出ている時間"); 44 TextField textDigits2 = new TextField(); 45 Label label4 = new Label("おすすめ時間:0.5秒〜1秒"); 46 47 fp1.getChildren().add(label3); 48 fp1.getChildren().add(textDigits2); 49 fp1.getChildren().add(label4); 50 51 Label label5 = new Label(" 計算回数"); 52 TextField textDigits3 = new TextField(); 53 Label label6 = new Label("おすすめ回数:1〜5回"); 54 fp1.getChildren().add(label5); 55 fp1.getChildren().add(textDigits3); 56 fp1.getChildren().add(label6); 57 58 Label label7 = new Label(" 計算方法"); 59 ComboBox<String> cmbCalc = new ComboBox<String>(); 60 61 String[] data = { "+", "ー", "×", "÷", "ランダム" }; 62 cmbCalc.getItems().addAll(data); 63 // コンボボックスに最初のデータを表示させておく 64 cmbCalc.setValue(data[0]); 65 66 fp1.getChildren().add(label7); 67 fp1.getChildren().add(cmbCalc); 68 69 Button btnConfig = new Button("設定完了"); 70 btnConfig.setOnAction(new FlashCalc(1, 1, 1)); 71 72 Button btnClose = new Button("閉じる"); 73 btnClose.setOnAction((ActionEvent) -> newStage.close()); 74 75 fp1.getChildren().add(btnConfig); 76 fp1.getChildren().add(btnClose); 77 78 Scene scene1 = new Scene(fp1); 79 newStage.setScene(scene1); 80 81 // 新しいウインドウを表示 82 newStage.show(); 83 } 84

java

1package games; 2 3import javafx.event.ActionEvent; 4import javafx.event.EventHandler; 5import javafx.scene.Scene; 6import javafx.scene.control.Label; 7import javafx.scene.layout.FlowPane; 8import javafx.scene.text.Font; 9import javafx.stage.Modality; 10import javafx.stage.Stage; 11 12public class FlashCalc implements EventHandler<ActionEvent> { 13 14 private int test; 15 16 FlashCalc(int keta, int kaisu, int jikan) { 17 test = keta; 18 } 19 20 @Override 21 public void handle(ActionEvent event) { 22 // TODO 自動生成されたメソッド・スタブ 23 24 Stage stage = new Stage(); 25 stage.initModality(Modality.APPLICATION_MODAL); 26 27 FlowPane fPane = new FlowPane(); 28 29 Label lblNumber = new Label(String.valueOf(test)); 30 lblNumber.setFont(Font.font(70)); 31 32 fPane.getChildren().add(lblNumber); 33 34 Scene scene = new Scene(fPane); 35 36 stage.setScene(scene); 37 38 stage.show(); 39 } 40 41} 42

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

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

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

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

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

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

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

akabee

2017/04/22 14:14 編集

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

2017/04/23 02:16

質問内容に追加しました
guest

回答1

0

ベストアンサー

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

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

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

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

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

java

1public class Games extends Application { 2 ... 3 btnFlash.setOnAction(ev -> { 4 new FlashCalcConfigurationController().start(); 5 }); 6 ... 7} 8 9public class FlashCalcConfigurationController { 10 void start() { 11 Stage stage = new Stage(...); 12 ... 13 final TextField textDigits1 = new TextField(...); 14 final TextField textDigits2 = new TextField(...); 15 final TextField textDigits3 = new TextField(...); 16 ... 17 Button btnConfig = new Button("設定完了"); 18 btnConfig.setOnAction(ev -> { 19 try { 20 // ----------------ここがポイント--------------------- 21 // 以下のようにstartメソッドの中にあるfinalなローカル変数にアクセスできます。 22 // (FlashCalcConfigurationControllerのフィールドにもアクセス可) 23 int keta = Integer.paserInt(textDigits1.getText()); 24 int jikan = Integer.parseInt(textDigits2.getText()); 25 int kaisu = Integer.paserInt(textDigits3.getText()); 26 new FlashCalc().start(keta, kaisu, jikan); 27 } catch (NumberFormatException e) { 28 ; 29 } 30 }); 31 ... 32 stage.show(); 33 } 34} 35 36public class FlashCalc implements EventHandler<ActionEvent> { 37 int keta; 38 int kaisu; 39 int jikan; 40 41 void start(int keta, int kaisu, double jikan) { 42 Stage stage = new Stage(...); 43 ... 44 stage.show(); 45 } 46}

投稿2017/04/24 03:01

KSwordOfHaste

総合スコア18394

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

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

sobue

2017/05/05 23:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問