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

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

詳細はこちら
JavaFX

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

Eclipse

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

Q&A

解決済

3回答

624閲覧

診断機能で必要なif文をなるべく減らしたいのですが、どなたか教えて頂けませんか…?

nakagen

総合スコア24

JavaFX

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

Eclipse

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

1グッド

0クリップ

投稿2021/01/03 07:46

編集2021/01/03 10:30

前提・実現したいこと

・現在、javafxで診断メーカーを作成しているのですが、全部で32通りの結果を作らなければいけません。そのため、EventHandlerよりif文の使用を考えているのですが、それでも31ものif文が出来てしまうため、なるべく減らす方法は無いのかと考えております。
・また、ファイル(txt)から文を読み込める仕組みと配列の作成の組み合わせも不明確なため、作成の方法をどなたか教えて頂きたいです。

該当のソースコード

javafx

1 class seEventHandler implements EventHandler<ActionEvent>{ 2 public void handle(ActionEvent e2) { 3 stage3 = new Stage(); 4 lb = new Label("「暑い」or「寒い」どっちなら我慢できる?"); 5 lb2 = new Label("1.暑い"); 6 lb3 = new Label("2.寒い"); 7 lb4 = new Label("下にある空欄に上の2つのどちらかをご記入ください"); 8 tf = new TextField(); 9 String str = tf.getText(); 10 if(str == "暑い"){ 11 12 } 13 else if(str == "寒い"){ 14 15 } 16 VBox hb=new VBox(20d); 17 hb.getChildren().add(lb2); 18 hb.getChildren().add(lb3); 19 VBox hb1=new VBox(10d); 20 hb1.getChildren().add(lb4); 21 hb1.getChildren().add(tf); 22 BorderPane bp =new BorderPane(); 23 Scene sc = new Scene(bp, 400, 400); 24 hb.setAlignment(Pos.CENTER); 25 bp.setTop(lb); 26 bp.setCenter(hb); 27 bp.setBottom(hb1); 28 stage3.setScene(sc); 29 stage3.show(); 30 }

試したこと

ファイル(txt)から、「暑い」、「寒い」、質問文を読み込める仕組み(配列…?)とif文の組み合わせ(forでできるのか…?)などを考えていました

TN8001👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/01/03 09:38

「発生している問題」欄にソースコードを貼ってますね。 質問は慎重に正しく編集した方が、親切な回答がつきやすいですよ。
nakagen

2021/01/03 10:31

ご指摘ありがとうございます。ただいま、訂正致しました。
guest

回答3

0

ベストアンサー

質問文は固定で、選択のYESの個数で判定するようなものですよね?
質問に重み付けがあったりするともっと本格的ですが、回答は単純に個数で判定しました。
文字で入力するのは面倒なのでボタンにしました。

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.stage.Stage; 19 20 21public class Main extends Application { 22 public static void main(String[] args) { launch(args); } 23 24 @Override public void start(Stage primaryStage) { 25 BorderPane root = new BorderPane(); 26 Button button = new Button("心理テストだよ"); 27 button.setOnAction(new seEventHandler()); 28 29 root.setCenter(button); 30 primaryStage.setScene(new Scene(root, 500, 400)); 31 primaryStage.show(); 32 } 33} 34 35class seEventHandler implements EventHandler<ActionEvent> { 36 private Label label; 37 private Button button1; 38 private Button button2; 39 40 private String[][] questions; // 質問の配列の配列(質問個数分の配列の中に「質問文・選択肢1・選択肢2」の配列が入っている) 41 private int index; // 今の質問インデックス 42 private int dog; 43 44 @Override public void handle(ActionEvent event) { 45 Stage stage = new Stage(); 46 BorderPane root = new BorderPane(); 47 root.setPadding(new Insets(10, 10, 10, 10)); 48 stage.setScene(new Scene(root, 400, 300)); 49 50 label = new Label(); 51 root.setCenter(label); 52 53 button1 = new Button(); 54 button2 = new Button(); 55 button1.setOnAction(ae -> { dog++; next(); }); 56 button2.setOnAction(ae -> next()); 57 58 VBox box = new VBox(10, button1, button2); 59 box.setAlignment(Pos.CENTER); 60 root.setBottom(box); 61 62 try { 63 createCSV(); 64 loadCSV(); 65 } catch (IOException e) { 66 e.printStackTrace(); 67 } 68 next(); 69 70 stage.show(); 71 } 72 73 private void next() { 74 if (index < questions.length) { // 質問作成 75 label.setText(questions[index][0]); // questions[index][0]が質問文 76 button1.setText(questions[index][1]); // questions[index][0]は選択肢1 77 button2.setText(questions[index][2]); 78 79 index++; 80 } else { // 結果判定 81 String result; 82 switch (dog) { 83 case 0: result = "あなたは完全に猫派です!"; break; 84 case 1: result = "あなたはどちらかというと猫派です。"; break; 85 case 2: result = "あなたはどちらかというと犬派です。"; break; 86 default: result = "あなたは完全に犬派です!"; break; 87 } 88 89 label.setText(result); 90 button1.setVisible(false); 91 button2.setVisible(false); 92 } 93 } 94 95 private void loadCSV() throws IOException { 96 List<String> lines = Files.readAllLines(Paths.get("test.csv"), StandardCharsets.UTF_8); // ファイルを1行毎のリストに読み込み 97 98 questions = new String[lines.size()][]; // 行数分配列を確保 99 for (int i = 0; i < lines.size(); i++) { 100 String[] split = lines.get(i).split(","); // カンマで区切って「質問文・選択肢1・選択肢2」の配列を作成 101 questions[i] = split; // questions配列のi番目の中にまた配列を入れた 102 } 103 } 104 105 // というtest.csvがあるテイで 106 private void createCSV() throws IOException { 107 List<String> lines = Arrays.asList( 108 "休日の過ごし方は?,みんなでワイワイ,ひとりで趣味を", 109 "久しぶりに雪が降ったらどうする?,外で駆け回る,コタツでぬくぬく", 110 "褒められるとついついしてしまうことは?,よだれを垂らしてしまう,興味ないふりをしてしまう"); 111 112 Files.write(Paths.get("test.csv"), lines, StandardCharsets.UTF_8); 113 } 114}

軽く説明を入れましたが、不明点があればコメントしてください。


一刻も早くプログラムを完成させたい気持ちはわかりますが、
Eclipse - ファイルの読み込みのエラーが原因なのでしょうか…?|teratail

を見る限り到底動くと思えません。ファイルを読み込む以前の問題です。

回答プログラムはtest.csvを作成してから読み込むようになっているので、どこにできているか確認してみてください。

投稿2021/01/03 13:17

編集2021/01/05 12:28
TN8001

総合スコア9855

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

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

TN8001

2021/01/05 08:36

こちらもvarを修正しました。 Java8ならこれで動くと思うので、求めているものとどこが違うのかコメントしてください。
nakagen

2021/01/05 08:54

ご回答をありがとうございます!2つ聞きたいのですが、何を見て動かないと思ったのでしょうか…?また、test.csvを用いているのですが、sample.txtを読み込んでやることは可能でしょうか…?無知で申し訳ありません…
TN8001

2021/01/05 09:11

>何を見て動かないと思ったのでしょうか…? 314041のコードでいえば ///診断機能 と書いてある行以降です。 この時点では String str = tf.getText(); に何も入っていませんから、switchが動くはずありません。 GUIプログラムはCUI(コンソール=黒い画面のやつ)プログラムとは全く作り方が変わってきます(イベントモデル) そういうこともあり回答ではボタンを使いました(TextFieldでは入力終わりをどう判断しますか?) >test.csvを用いているのですが、sample.txtを読み込んでやることは可能でしょうか…? もちろん可能です。 1行1問のほうがシンプルに書けると思ったのでそうしただけですが、そこはもう決定している話なんでしょうか?
nakagen

2021/01/05 09:19

申し訳ありません、こちらがgetTextを空欄に記入した言葉をstrに反映させるものだと誤認してしまいました。そうですよね、、、そう考えましたら、ボタンの方が使いやすいことになりますよね。sample.txtの件につきましては、後々でも文を更新できるようtxtから読み込みたいと考えておりました…。
TN8001

2021/01/05 09:34

勘違いしておられるようですが、test.csvもテキストファイルです。 カンマで区切って表形式のデータを表すという、テキスト形式のファイルです。 [Comma-Separated Values - Wikipedia](https://ja.wikipedia.org/wiki/Comma-Separated_Values test.txtとしても別に問題はありませんが、この形式のファイルは.csvと拡張子をつけるのが慣例です。 >1行1問のほうがシンプルに書けると思ったのでそうしただけですが、そこはもう決定している話なんでしょうか? これは1問3行か、1問1行かの話が主題です。
nakagen

2021/01/05 09:50

なるほど、そうでしたか…。このコードをイベントハンドラの中で作動させたいのですが、可能ですかね…?
TN8001

2021/01/05 10:21

まず実行はしていただけて、やりたいこととおおむね合っているということでいいんでしょうか? >このコードをイベントハンドラの中で作動させたい メニュー画面のようなものがあって、そこからさらにウィンドウを出しているということでしょうか? class Main から class seEventHandler に public void start から public void handle に でおおむね行けると思います。
nakagen

2021/01/05 10:26

一度、実行したのですが、イメージしていたのと合っていました。「メニュー画面のようなものがあって、そこからさらにウィンドウを出しているということでしょうか?」についてですが、その通りです。一度やってみます!
nakagen

2021/01/05 10:49

すみません、class Mainからclass seEventHandlerに変更するというのは、 class seEventHandler implements EventHandler<ActionEvent>{ public void handle(ActionEvent e2) { BorderPane root = new BorderPane(); root.setPadding(new Insets(10, 10, 10, 10)); primaryStage.setScene(new Scene(root, 400, 300)); label = new Label(); root.setCenter(label); button1 = new Button(); button2 = new Button(); button1.setOnAction(ae -> { dog++; next(); }); button2.setOnAction(ae -> next()); VBox box = new VBox(10, button1, button2); box.setAlignment(Pos.CENTER); root.setBottom(box); createCSV(); loadCSV(); next(); primaryStage.show(); } private void next() { 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++; } else { // 結果判定 String result; switch (dog) { case 0: result = "あなたは完全に猫派です!"; break; case 1: result = "あなたはどちらかというと猫派です。"; break; case 2: result = "あなたはどちらかというと犬派です。"; break; default: result = "あなたは完全に犬派です!"; break; } label.setText(result); button1.setVisible(false); button2.setVisible(false); } } private void loadCSV() throws IOException { List<String> lines = Files.readAllLines(Paths.get("test.csv"), StandardCharsets.UTF_8); // ファイルを1行毎のリストに読み込み questions = new String[lines.size()][]; // 行数分配列を確保 for (int i = 0; i < lines.size(); i++) { String[] split = lines.get(i).split(","); // カンマで区切って「質問文・選択肢1・選択肢2」の配列を作成 questions[i] = split; // questions配列のi番目の中にまた配列を入れた } } // というtest.csvがあるテイで private void createCSV() throws IOException { List<String> lines = Arrays.asList( "休日の過ごし方は?,みんなでワイワイ,ひとりで趣味を", "久しぶりに雪が降ったらどうする?,外で駆け回る,コタツでぬくぬく", "褒められるとついついしてしまうことは?,よだれを垂らしてしまう,興味ないふりをしてしまう"); Files.write(Paths.get("test.csv"), lines, StandardCharsets.UTF_8); } } } といった感じで大丈夫でしょうか?
退会済みユーザー

退会済みユーザー

2021/01/05 11:54

質問の内容が変わってきてるので、この質問は解決済にして別の質問を立てた方がいいと思います。 コメント欄はマークダウン効かないから、コードが読みづらいですし。
TN8001

2021/01/05 12:28

>といった感じで大丈夫でしょうか? といった感じです。 が、大丈夫ならコメントしていないでしょうし、だめならエラー文を書いてください。 回答コードをメニュー画面付きに変更しました。 @m-oguraさん お気遣いありがとうございます。 おそらくこの質問を見ていないと意味が分からない質問になるでしょうから、もう回答してしまいます^^;
nakagen

2021/01/05 12:33

m-oguraさん そうですよね、最初の質問の主旨から大きく逸れてしまいました… 次回から、そうするよう気を付けます
nakagen

2021/01/05 12:36

TN8001さん 私の様々な質問につき合わせてしまい、大変申し訳ありませんでした。次回から、このようなことが無いよう気を付けたいと思います。また、コードの知識等を頂き本当にありがとうございました。
guest

0

switchと配列で解決することが出来ました

投稿2021/01/05 16:45

nakagen

総合スコア24

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

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

0

1つ目の質問については、switch文を使うとすっきりします。
【Java】switch文でStringの文字列を扱う方法
2つ目の質問ですが、ググればいくらでも答えが見つかりますので、頑張ってください。

投稿2021/01/03 09:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nakagen

2021/01/03 10:27

ご回答をありがとうございます!switch文を作成してみたのですが… switch(str) { case"暑い": switch(str) { } case"寒い": switch(str) { } break; default: といった感じで繰り返すのでしょうか…? 配列のほうは、こちらで頑張って探してみます!(どうしてもわからなかったときは、またお聞きしてもよろしいでしょうか…?)
退会済みユーザー

退会済みユーザー

2021/01/03 10:52

まずはリンク先でswitch文の書き方を把握してください。 配列に関しては、ググればサンプルコードがいくらでも転がってます。 頑張って!
nakagen

2021/01/03 11:58

一度、配列と組み合わせて書いてみたのですが… /// switch(str) { case sT[1]: /// lb.setText(sT[1]); /// switch(str){ case sT[4]: switch(str) { case sT[10]: switch(str) { case"14": break; case"15": break; } break; case sT[11]: switch(str) { case"16": break; case"17": break; } break; } break; case sT[5]: switch(str) { case sT[13]: switch(str) { case"18": break; case"19": break; } break; case sT[14]: switch(str) { case"20": break; case"21": break; } break; } break; } break; /// case に配列を入れたらエラーが起きてしまいました… この場合は、どうしたらいいのでしょうか…?
nakagen

2021/01/03 12:15

すみません、switc文にswitc文をいれて2択の質問に答えていくことは可能ですよね…?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問