前提・実現したいこと
・現在、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でできるのか…?)などを考えていました
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/03 10:31
回答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総合スコア9862
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/05 08:36
2021/01/05 08:54
2021/01/05 09:11
2021/01/05 09:19
2021/01/05 09:34
2021/01/05 09:50
2021/01/05 10:21
2021/01/05 10:26
2021/01/05 10:49
退会済みユーザー
2021/01/05 11:54
2021/01/05 12:28
2021/01/05 12:33
2021/01/05 12:36
2021/01/05 15:46
0
1つ目の質問については、switch文を使うとすっきりします。
【Java】switch文でStringの文字列を扱う方法
2つ目の質問ですが、ググればいくらでも答えが見つかりますので、頑張ってください。
投稿2021/01/03 09:36
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/03 10:27
退会済みユーザー
2021/01/03 10:52
2021/01/03 11:58
2021/01/03 12:15
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。