🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaFX

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

1372閲覧

診断機能の仕上げをしたい

nakagen

総合スコア24

JavaFX

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

1グッド

0クリップ

投稿2021/01/05 15:45

編集2021/01/05 15:53

前提・実現したいこと

現在、診断機能で、診断機能の仕組みは作れたのですが…
・primaryStageを解決することが出来ない
・32通りの答えの辿り着き方
が現在、分かりません…

よろしくお願いいたします。

発生している問題・エラーメッセージ

xception in thread "JavaFX Application Thread" java.lang.Error: Unresolved compilation problems: primaryStage を解決できません primaryStage を解決できません at saisyuukadai.date2$seEventHandler.handle(date2.java:198) at saisyuukadai.date2$seEventHandler.handle(date2.java:1) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Node.fireEvent(Node.java:8411) at javafx.scene.control.Button.fire(Button.java:185) at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:432) at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431) at com.sun.glass.ui.View.handleMouseEvent(View.java:555) at com.sun.glass.ui.View.notifyMouse(View.java:937) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177) at java.lang.Thread.run(Thread.java:748)

該当のソースコード

javafx

1 class seEventHandler implements EventHandler<ActionEvent>{ 2 public void handle(ActionEvent e2) { 3 BorderPane root = new BorderPane(); 4 root.setPadding(new Insets(10, 10, 10, 10)); 5 primaryStage.setScene(new Scene(root, 400, 300)); 6 7 lb = new Label(); 8 root.setCenter(lb); 9 10 bt1 = new Button(); 11 bt2 = new Button(); 12 bt1.setOnAction(ae -> { dog++; next(); }); 13 bt2.setOnAction(ae -> next()); 14 15 VBox box = new VBox(10, bt1, bt2); 16 box.setAlignment(Pos.CENTER); 17 root.setBottom(box); 18 19 createCSV(); 20 loadCSV(); 21 next(); 22 23 primaryStage.show(); 24 } 25 26 private void next() { 27 if (index < questions.length) { // 質問作成 28 lb.setText(questions[index][0]); // questions[index][0]が質問文 29 bt1.setText(questions[index][1]); // questions[index][0]は選択肢1 30 bt2.setText(questions[index][2]); 31 32 index++; 33 } else { // 結果判定 34 String result; 35 switch (dog) { 36 case 0: result = "あなたは完全に猫派です!"; break; 37 case 1: result = "あなたはどちらかというと猫派です。"; break; 38 case 2: result = "あなたはどちらかというと犬派です。"; break; 39 default: result = "あなたは完全に犬派です!"; break; 40 } 41 42 lb.setText(result); 43 bt1.setVisible(false); 44 bt2.setVisible(false); 45 } 46 } 47 48 private void loadCSV() throws IOException { 49 List<String> lines = Files.readAllLines(Paths.get("test.csv"), StandardCharsets.UTF_8); // ファイルを1行毎のリストに読み込み 50 51 questions = new String[lines.size()][]; // 行数分配列を確保 52 for (int i = 0; i < lines.size(); i++) { 53 String[] split = lines.get(i).split(","); // カンマで区切って「質問文・選択肢1・選択肢2」の配列を作成 54 questions[i] = split; // questions配列のi番目の中にまた配列を入れた 55 } 56 } 57 58 // というtest.csvがあるテイで 59 private void createCSV() throws IOException { 60 List<String> lines = Arrays.asList( 61 "休日の過ごし方は?,みんなでワイワイ,ひとりで趣味を", 62 "久しぶりに雪が降ったらどうする?,外で駆け回る,コタツでぬくぬく", 63 "褒められるとついついしてしまうことは?,よだれを垂らしてしまう,興味ないふりをしてしまう"); 64 65 Files.write(Paths.get("test.csv"), lines, StandardCharsets.UTF_8); 66 } 67 }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

jdk14

TN8001👍を押しています

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

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

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

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

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

TN8001

2021/01/05 16:12

[Eclipse - 診断機能で必要なif文をなるべく減らしたいのですが、どなたか教えて頂けませんか…?|teratail](https://teratail.com/questions/313715 の回答コードをメニュー画面付きに更新しています。確認してください。 急いでいる理由があるのかもしれませんが、落ち着いて一つずつ解決していきましょう。
nakagen

2021/01/05 16:20

ありがとうございます、、、!今作成しているプログラミングだと、メニュー画面には、他の機能に行ける画面となっているので、可能であればイベントハンドラの中でまとめたいのですが、可能でしょうか…?
TN8001

2021/01/05 16:25

メニュー画面がどうなっているのかはわかりませんが、class seEventHandlerに入っていればいいのではないのですか? >イベントハンドラの中でまとめたい というのはどういう状態なんでしょうか??
nakagen

2021/01/05 16:29

すみませんでした、今、意味が分かりました… 私が悩んでいたのは、primarystageの意味で、修正していただいたコードを読んで直したところ診断の画面につなぐことが出来ました。 「イベントハンドラの中でまとめたい」につきましては、primaryStageをイベントハンドラの中で使うものだと思っていました…
TN8001

2021/01/05 16:35

そうですか。よかったです^^ この質問ですが、313715とかぶっているように思うので削除依頼をされたらどうでしょうか。 もし削除依頼が通らなかった場合は、自己回答で閉じてください。
nakagen

2021/01/05 16:38

了解です! 最後に一つだけ、お聞きしたいのですが、この診断の結果(4通りの)は、どのようにして出しているのでしょうか…?自分の理想が32通りなのですが、作れますかね…?
nakagen

2021/01/05 16:59 編集

すみません、もしかしてこれって --- if (index < questions.length) { // 質問作成 label.setText(questions[index][0]); // questions[index][0]が質問文 button1.setText(questions[index][1]); // questions[index][0]は選択肢1 button2.setText(questions[index][2]); index++; } --- で、質問の数によって、出される答えの数が増えていく意味なのでしょうか? 2の5乗みたいなイメージで…
TN8001

2021/01/05 17:10

>どのようにして出しているのでしょうか…? 回答コードはYESの個数ですので、3*2の6通りの組み合わせがありますが、順番?は気にしない実装です。 >理想が32通りなのですが、作れますかね…? 32通りというと16*2ということでしょうかね。 結果の取得が、回答が欲しいのか・どちらを選んだかわかればいいのかがよくわかりません。 >質問の数によって、出される答えの数が増えていく意味なのでしょうか? >2の5乗みたいなイメージで… ちょっと意味が分かりませんが、2次元配列を使っています。 質問1,選択肢1,選択肢2 質問2,選択肢1,選択肢2 質問3,選択肢1,選択肢2 行がindexで、列が0,1,2になっています。 // 質問作成 というコメント文はちょっと良くなかったかもしれません^^; 質問内容を画面に反映という意味です。
nakagen

2021/01/05 17:16 編集

「結果の取得が、回答が欲しいのか・どちらを選んだかわかればいいのかがよくわかりません。」についてなのですが、           〇は質問となります        回答1 回答2       〇       〇    回答1 回答2 回答1 回答2   〇      〇 〇     〇 みたいな感じで進めて、最終的に32通りの結果に繋げたい感じです… 説明が分かりにくくてすみません、、、
TN8001

2021/01/05 17:51

この図?だと矢印に沿って問題も変わるようなタイプのものに見えてしまいますが、そうではなく各段の問題は同じということでいいんでしょうかね? 恐らくそうだとして、 でしたら文字列を使って〇〇×〇のように、16問分回答を足していくのが簡便かもしれません。 あれ?これを考えているうちに勘違いに気づきましたが、順番を気にするなら、3問だと2^3の8通りですね^^; ということは一人が答える質問は5問なんでしょうか?(2^5) ルートによって質問が変わるタイプで16問用意しているということ?? 最初に >質問文は固定で、選択のYESの個数で判定するようなものですよね? と確認したのですが、ルートによって質問が変わるとなるとだいぶ話が違ってきます。。。
nakagen

2021/01/05 17:55

>ということは一人が答える質問は5問なんでしょうか?(2^5) ルートによって質問が変わるタイプで16問用意しているということ?? すみません、、、その通りです… やはり、if文などで、コツコツやるしかないのでしょうか…
TN8001

2022/09/18 04:34 編集

となるとツリー状になりますから、CSVとあまり相性が良くないですねぇ。 何かいいアイデアが浮かべばいいのですが。。。 ちょっと考えさせてください。
nakagen

2021/01/05 19:01

了解です、お手間をおかけしてすみません、、、
m.ts10806

2021/01/05 23:32

あまりやりすぎると「質問と回答」ではなく「作業依頼」になるので、ヒントを得る程度にとどめられたほうが良いかと思います。
YT0014

2021/01/06 03:40

上記で説明した、質問と回答の遷移に関しては、仕様として、質問文に追記してください。
guest

回答2

0

ベストアンサー

回答がついてしまったのと、追記依頼でのやり取りもあるのでこちらに回答します。

質問のYESNOで矢印に沿っていく「診断チャート」のようなものが、やりたいことだったわけです(質問タイトルはあまり良いとは思えません)

当初質問を読み違えて遠回りになってしまいましたが^^;、このようなものはどうでしょう?

実装の理解のしやすさと、質問の編集のしやすさのバランスを取りました。

本来はjsonxml等ツリーを扱えるテキスト形式が良いと思いますが、Javaで読むのは割と面倒なのでcsvのままにします。

1行を「質問,選択1,選択2,選択1ジャンプ行番号,選択2ジャンプ行番号」のように表し、ジャンプ先を手書きします^^;(YT0014さんの案と同じ感じです。手書きは面倒ですが仕方ないですね)

java

1import java.io.IOException; 2import java.nio.charset.StandardCharsets; 3import java.nio.file.Files; 4import java.nio.file.Paths; 5import java.util.Arrays; 6import java.util.List; 7 8import javafx.application.Application; 9import javafx.event.ActionEvent; 10import javafx.event.EventHandler; 11import javafx.geometry.Insets; 12import javafx.geometry.Pos; 13import javafx.scene.Scene; 14import javafx.scene.control.Button; 15import javafx.scene.control.Label; 16import javafx.scene.layout.BorderPane; 17import javafx.scene.layout.VBox; 18import javafx.scene.text.TextAlignment; 19import javafx.stage.Stage; 20 21 22public class Main extends Application { 23 public static void main(String[] args) { launch(args); } 24 25 @Override public void start(Stage primaryStage) { 26 BorderPane root = new BorderPane(); 27 Button button = new Button("心理テストだよ"); 28 button.setOnAction(new seEventHandler()); 29 30 root.setCenter(button); 31 primaryStage.setScene(new Scene(root, 500, 400)); 32 primaryStage.show(); 33 } 34} 35 36class Question { 37 String Text; // 診断結果or質問文 38 String Choice1; // 選択肢1 39 String Choice2; // 選択肢2 40 int Jump1; // 選択肢ジャンプ先インデックス番号 41 int Jump2; 42 43 public Question(String line) { 44 // インデントがあれば削除しカンマで区切る 45 String[] split = line.trim().split(","); 46 47 // 質問or診断中の'↵'は改行に置換 48 Text = split[0].replace('↵', '\n'); 49 50 if (5 <= split.length) { 51 Choice1 = split[1]; 52 Choice2 = split[2]; 53 54 // 編集しやすいように行番号=1始まり と ヘッダー行分のマイナス2 55 Jump1 = Integer.parseInt(split[3]) - 2; 56 Jump2 = Integer.parseInt(split[4]) - 2; 57 } 58 } 59} 60 61class seEventHandler implements EventHandler<ActionEvent> { 62 private Label label; 63 private Button button1; 64 private Button button2; 65 66 private Question[] questions; // 質問の配列 67 private Question current; // 現在の質問 68 69 @Override public void handle(ActionEvent event) { 70 Stage stage = new Stage(); 71 BorderPane root = new BorderPane(); 72 root.setPadding(new Insets(10, 10, 10, 10)); 73 stage.setScene(new Scene(root, 400, 300)); 74 75 label = new Label(); 76 label.setTextAlignment(TextAlignment.CENTER); // 中央揃え 77 label.setWrapText(true); // 折り返し 78 root.setCenter(label); 79 80 button1 = new Button(); 81 button2 = new Button(); 82 83 // 質問の選択によってジャンプ先を変更 84 button1.setOnAction(ae -> jump(current.Jump1)); 85 button2.setOnAction(ae -> jump(current.Jump2)); 86 87 VBox box = new VBox(10, button1, button2); 88 box.setAlignment(Pos.CENTER); 89 root.setBottom(box); 90 91 try { 92 createCSV(); 93 loadCSV(); 94 } catch (IOException e) { 95 e.printStackTrace(); 96 } 97 98 jump(0); // 最初は先頭の質問 99 100 stage.show(); 101 } 102 103 private void jump(int index) { 104 current = questions[index]; // 現在の質問を指定インデックスの質問に変更 105 106 label.setText(current.Text); 107 108 // Choiceがnull = 診断結果 109 if (current.Choice1 == null) button1.setVisible(false); 110 else button1.setText(current.Choice1); 111 112 if (current.Choice2 == null) button2.setVisible(false); 113 else button2.setText(current.Choice2); 114 } 115 116 private void loadCSV() throws IOException { 117 List<String> lines = Files.readAllLines(Paths.get("test.csv"), StandardCharsets.UTF_8); // ファイルを1行毎のリストに読み込み 118 119 questions = new Question[lines.size() - 1]; // ヘッダーを除いた行数分配列を確保 120 for (int i = 1; i < lines.size(); i++) { // i = 1 ヘッダーは飛ばす 121 questions[i - 1] = new Question(lines.get(i)); // ヘッダーを除いてるので i - 1 122 } 123 } 124 125 // というtest.csvがあるテイで 126 private void createCSV() throws IOException { 127 List<String> lines = Arrays.asList( 128 // インデントは単に見やすくするだけで、階層を解析しているわけではない 129 // 問1問2問2問3問3問3問3 の順番でも別に構わないが、おそらく見にくいw 130 // ジャンプ行番号を間違えるとループしたり、IndexOutOfBoundsException が出ます! 131 // 質問or診断中の'↵'は、読み込み時に改行に置換 132 "質問,選択1,選択2,選択1ジャンプ行番号,選択2ジャンプ行番号", 133 "問1:,aaa,bbb,3,10", 134 " 問2:,aaa,bbb,4,7", 135 " 問3:,aaa,bbb,5,6", 136 " 診断↵aaa aaa aaa", 137 " 診断↵aaa aaa bbb", 138 " 問3:,aaa,bbb,8,9", 139 " 診断↵aaa bbb aaa", 140 " 診断↵aaa bbb bbb", 141 " 問2:,aaa,bbb,11,14", 142 " 問3:,aaa,bbb,12,13", 143 " 診断↵bbb aaa aaa", 144 " 診断↵bbb aaa bbb", 145 " 問3:,aaa,bbb,15,16", 146 " 診断↵bbb bbb aaa", 147 " 診断↵bbb bbb bbb"); 148 149 Files.write(Paths.get("test.csv"), lines, StandardCharsets.UTF_8); 150 } 151}

投稿2021/01/06 09:12

TN8001

総合スコア9855

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

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

nakagen

2021/01/06 10:26

ご回答ありがとうございます…!ファイルの指定ができるように、アレンジしたいと思います…!もし、また分からなくなった場合は、他の質問ページでよろしくお願いいたします
guest

0

primaryStageは、コードのイベントハンドラの使われ方が不明なので、明確な回答ができません。
新規にStageを作成するか、e2のプロパティなどから取得するかになるかと思いますが。

診断機能の遷移から考えると、データ構造としては、以下をお勧めします。

回答データ
選択肢、次質問コード、診断結果

質問データ
質問コード、質問、回答データ配列

CSVでは、回答データ配列を、回答1、回答2の順番で記載。
質問コードをキーとしたMapで管理。
回答に応じて、次の質問へ。

次質問コードがなければ終了。

ついでに、結果データも、コード込みの結果情報をMapで管理するのも良いかもしれません。

投稿2021/01/06 04:01

YT0014

総合スコア1748

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問