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

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

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

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

Java

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

Q&A

解決済

1回答

3881閲覧

javafxのGUI作成。画面遷移がうまくいかない問題

javasyosinnsya1

総合スコア26

JavaFX

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

Java

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

0グッド

0クリップ

投稿2017/06/07 07:24

ただいま画面遷移の練習をしています。
下記に記述したコード1単体だと
『スタート』を押すと『タイトルに戻る』に遷移され、画面遷移がしっかりと出来ているのですが、コード1とコード2を合わせて作ろうと思うとうまくいきません。
具体的には、『スタート』を押した時に画面が切り替わってラベルや『ルール説明』のボタンが消えて『タイトルに戻る』ボタンだけが表示されるようにしたいです。
どのようにしたらそのように出来るか教えてください。
よろしくお願い致します。

Java

1コード1 2import javafx.application.Application; 3import javafx.event.ActionEvent; 4import javafx.event.EventHandler; 5import javafx.scene.Scene; 6import javafx.scene.control.Button; 7import javafx.scene.layout.BorderPane; 8import javafx.scene.layout.StackPane; 9import javafx.stage.Stage; 10 11 public class cord1 extends Application { 12 public static void main(String[] args) 13 { 14 launch(args); 15 } 16 17 @Override 18 public void start(Stage stage) throws Exception { 19 20 final BorderPane MC = new BorderPane(); 21 Button next = new Button("スタート"); 22 MC.setCenter(next); 23 24 final BorderPane MCZ = new BorderPane(); 25 Button prev = new Button("タイトルに戻る"); 26 MCZ.setCenter(prev); 27 MCZ.setVisible(false); 28 29 StackPane root = new StackPane(); 30 root.getChildren().add(MC); 31 root.getChildren().add(MCZ); 32 33 next.setOnAction(new EventHandler<ActionEvent>() { 34 35 @Override 36 public void handle(ActionEvent event) { 37 MC.setVisible(false); 38 MCZ.setVisible(true); 39 } 40 }); 41 42 prev.setOnAction(new EventHandler<ActionEvent>() { 43 44 @Override 45 public void handle(ActionEvent event) { 46 MC.setVisible(true); 47 MCZ.setVisible(false); 48 } 49 }); 50 51 Scene scene = new Scene(root, 400, 300); 52 stage.setScene(scene); 53 stage.setTitle("画面遷移"); 54 stage.show(); 55 } 56 } 57 58コード2 59import javafx.application.Application; 60import javafx.event.ActionEvent; 61import javafx.event.EventHandler; 62import javafx.scene.Scene; 63import javafx.scene.control.Alert; 64import javafx.scene.control.Button; 65import javafx.scene.control.Label; 66import javafx.scene.layout.BorderPane; 67import javafx.scene.layout.Pane; 68import javafx.stage.Stage; 69 70public class cord2 extends Application{ 71 72 private Label lb; 73 private Button bt1, bt2; 74 75 public static void main(String[] args) 76 { 77 launch(args); 78 } 79 80 @Override 81 public void start(Stage stage) throws Exception { 82 // TODO 自動生成されたメソッド・スタブ 83 84 lb = new Label("画面遷移"); 85 bt1 = new Button("ルール説明"); 86 Button bt2 = new Button("スタート"); 87 88 BorderPane bp = new BorderPane(); 89 90 bp.setTop(lb); 91 bp.setBottom(bt1); 92 bp.setCenter(bt2); 93 94 95 bt1.setOnAction(new SampleEventHandler()); 96 97 Scene sc = new Scene(bp, 400, 300); 98 99 stage.setScene(sc); 100 stage.setTitle("画面遷移"); 101 stage.show(); 102 } 103 104 class SampleEventHandler implements 105 EventHandler<ActionEvent> 106 { 107 public void handle(ActionEvent e) 108 { 109 Alert al = new Alert(Alert.AlertType.INFORMATION); 110 al.setTitle("ルール説明"); 111 al.getDialogPane() 112 .setHeaderText("ルール説明"); 113 al.show(); 114 115} 116} 117}

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

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

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

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

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

guest

回答1

0

ベストアンサー

以前の質問の回答の最初のコメントを繰り返します。

いくつものApplicationクラスを一つのアプリケーションに定義して動かしたことはないのですが、多分そんな方法はJavaFXランタイムを混乱させる気がするので止した方が無難だと思います。

アプリケーションクラスをただ一つにし、2つの画面を切り替える(以前の回答よりは少し進んだ)別の例を示してみます。これが唯一の例ではなく一番推奨できる方法という訳ではありません。書き方は色々あります。

java

1// 2// 唯一のアプリケーションクラス 3// 4public class MyApp extends Application { 5 private static MyApp app; 6 7 public static void switchRoot(int which) { 8 switch (whitch) { 9 case 1: app.scene.setRoot(roo1); break; 10 case 2: app.scene.setRoot(roo2); break; 11 default: throw new InternalError("oops!"); 12 } 13 } 14 15 //-------------------------------------------- 16 17 private Root1 root1; 18 private Root2 root2; 19 private Scene scene; 20 21 @Override public void start(Stage stage) { 22 app = this; 23 stage.setTitle("..."); 24 root1 = new Root1(); 25 root2 = new Root2(); 26 scene = new Scene(root1, 300, 300); 27 stage.show(); 28 } 29} 30 31// 1つ目の画面 32public class Root1 extends BorderPane { 33 public BorderPane() { 34 Button button = ...; // 2つ目の画面へ遷移するボタン 35 button.setOnAction(ev -> MyApp.switchRoot(2)); 36 setButtom(button); 37 ... 38 } 39} 40 41// 2つ目の画面 42public class Root2 extends BorderPane { 43 public BorderPane() { 44 Button button = ...; // 1つ目の画面へ遷移するボタン 45 button.setOnAction(ev -> MyApp.switchRoot(1)); 46 setButtom(button); 47 ... 48 } 49}

補足:例示コードによくない点もあるので補足します。

  • Root1/Root2を別のクラスにしている意味

質問者さんの元のコードでは2つのアプリケーションクラスで2つの画面の遷移をすることを意図していましたが、回答先頭にかいたようにお勧めできないので、ルートノードのクラスをBorderPaneの派生として独立させ、それぞれに画面ごとの制御やレイアウトを記述する考え方を例示してみました。
Root1,Root2は互いに他の画面の内部詳細にさわらない(見えない)方針とするため、相互の画面遷移部分はアプリケーションクラスのswitchRootメソッドにまかせる方式としています。

  • MyAppは行儀のよいシングルトンではない

事実上JavaFXのアプリケーションクラスのインスタンスは一つしか生成されることはありませんが、それを保証するような行儀のよさは上記コードにはありません。(JavaFXの仕組み上、コンストラクターをprivateにできないのです)
しかしインスタンスが一つであるという前提で、staticなフィールド/メソッドを通じてインスタンスがシングルトンであるかのように利用しています。シングルトンを仮定しないコードの方が行儀がよいですが、それは質問者さんご自身で考えてみるとよいと思います。

  • 画面を切り替えるswitchRootの引数がint

1とか2といったマジックナンバーを渡しています。行儀のよいプログラムならenumなどにすべきですがそのような行儀のよさは省いています。

投稿2017/06/07 08:31

編集2017/06/14 06:19
KSwordOfHaste

総合スコア18392

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問