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

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

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

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

Java

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

Q&A

解決済

1回答

893閲覧

Javaの実行中にでたエラーの治し方を教えてほしいです。

komattasan

総合スコア1

JavaFX

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

Java

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

0グッド

0クリップ

投稿2023/01/29 16:48

編集2023/01/30 03:38

前提

JavaFXで、提出した課題の数によって、成績を計算するプログラムを作っています。
エラーメッセージが出てしまい、どうしたらいいのかわからず、質問をさせていただきました。

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • とにかくエラーをなくす。
  • チェックボックスを用いて提出、非提出を管理する。
  • 課題の配点を15回で割ってそれを足していくようなものにしたい。

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

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: class javafx.scene.control.CheckBox cannot be cast to class javafx.scene.control.TextField (javafx.scene.control.CheckBox and javafx.scene.control.TextField are in module javafx.controls@19 of loader 'app') at Otameshi$MyEventHandler.handle(Otameshi.java:139) at Otameshi$MyEventHandler.handle(Otameshi.java:120) at javafx.base@19/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247) at javafx.base@19/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) at javafx.base@19/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234) at javafx.base@19/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at javafx.base@19/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at javafx.base@19/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at javafx.base@19/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base@19/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base@19/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base@19/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base@19/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base@19/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at javafx.base@19/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) at javafx.base@19/javafx.event.Event.fireEvent(Event.java:198) at javafx.graphics@19/javafx.scene.Node.fireEvent(Node.java:8923) at javafx.controls@19/javafx.scene.control.CheckBox.fire(CheckBox.java:240) at javafx.controls@19/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:207) at javafx.controls@19/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274) at javafx.base@19/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247) at javafx.base@19/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) at javafx.base@19/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234) at javafx.base@19/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at javafx.base@19/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at javafx.base@19/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at javafx.base@19/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base@19/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base@19/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base@19/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at javafx.base@19/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at javafx.base@19/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at javafx.base@19/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) at javafx.base@19/javafx.event.Event.fireEvent(Event.java:198) at javafx.graphics@19/javafx.scene.Scene$MouseHandler.process(Scene.java:3894) at javafx.graphics@19/javafx.scene.Scene.processMouseEvent(Scene.java:1887) at javafx.graphics@19/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2620) at javafx.graphics@19/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:411) at javafx.graphics@19/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:301) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at javafx.graphics@19/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:450) at javafx.graphics@19/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:424) at javafx.graphics@19/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:449) at javafx.graphics@19/com.sun.glass.ui.View.handleMouseEvent(View.java:551) at javafx.graphics@19/com.sun.glass.ui.View.notifyMouse(View.java:937) at javafx.graphics@19/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics@19/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184) at java.base/java.lang.Thread.run(Thread.java:1589)

試したこと

問題点がどこかわからずいろいろといじりました。

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

openjdk version "19.0.1" 2022-10-18
OpenJDK Runtime Environment (build 19.0.1+10-21)
OpenJDK 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)

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

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

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

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

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

jimbe

2023/01/29 17:10 編集

とりあえずチェックボックス15個分をやたら並べるのではなく、配列やループで纏めると多少は見通し良くなると思います。 >おそらく最新のバージョン teratail は質問は長く残すことが目的です。質問時は最新でも数年後に見た時にはどのバージョンだか全く分かりません。
komattasan

2023/01/29 17:05 編集

>>jimbeさん コメントありがとうございます!! 当初はfor文を用いてループをしており、チェックボックスも配列で出していたのですが、うまくいかなかったので羅列している次第です。。。;;見通しにくくて申し訳ないです。 そうなんですね!初めての質問だったのでわかりやすく教えていただいて助かります。編集してきます。
komattasan

2023/01/29 17:18

わ!なにからなにまでありがとうございます!大変参考になります!!
komattasan

2023/01/29 17:42

### 該当のソースコード ```Java import javafx.application.*; import javafx.scene.*; import javafx.scene.layout.*; import javafx.scene.control.*; import javafx.stage.*; import javafx.event.*; import javafx.geometry.*; import javafx.collections.*; public class Otameshi extends Application { private Label resultlb; public void start(Stage stage) throws Exception { //ラベルの生成・設定 Label[] lb = new Label[3]; lb[0] = new Label("課題提出の配点を入力してください"); lb[1] = new Label("課題を提出した講義を選択してください"); lb[2] = new Label(" "); resultlb = new Label("ここに結果が表示されます"); //テキストフィールドを生成/設定します TextField scoretf = new TextField(); //チェックボックスの生成・設定 CheckBox cb1 = new CheckBox("第1回課題"); CheckBox cb2 = new CheckBox("第2回課題"); CheckBox cb3 = new CheckBox("第3回課題"); CheckBox cb4 = new CheckBox("第4回課題"); CheckBox cb5 = new CheckBox("第5回課題"); CheckBox cb6 = new CheckBox("第6回課題"); CheckBox cb7 = new CheckBox("第7回課題"); CheckBox cb8 = new CheckBox("第8回課題"); CheckBox cb9 = new CheckBox("第9回課題"); CheckBox cb10 = new CheckBox("第10回課題"); CheckBox cb11 = new CheckBox("第11回課題"); CheckBox cb12 = new CheckBox("第12回課題"); CheckBox cb13 = new CheckBox("第13回課題"); CheckBox cb14 = new CheckBox("第14回課題"); CheckBox cb15 = new CheckBox("第15回課題"); cb1.setSelected(false); cb2.setSelected(false); cb3.setSelected(false); cb4.setSelected(false); cb5.setSelected(false); cb6.setSelected(false); cb7.setSelected(false); cb8.setSelected(false); cb9.setSelected(false); cb10.setSelected(false); cb11.setSelected(false); cb12.setSelected(false); cb13.setSelected(false); cb14.setSelected(false); cb15.setSelected(false); //イベントハンドラ設定 MyEventHandler actionhandler = new MyEventHandler(); scoretf.addEventHandler(ActionEvent.ANY, actionhandler); cb1.addEventHandler(ActionEvent.ANY, actionhandler); cb2.addEventHandler(ActionEvent.ANY, actionhandler); cb3.addEventHandler(ActionEvent.ANY, actionhandler); cb4.addEventHandler(ActionEvent.ANY, actionhandler); cb5.addEventHandler(ActionEvent.ANY, actionhandler); cb6.addEventHandler(ActionEvent.ANY, actionhandler); cb7.addEventHandler(ActionEvent.ANY, actionhandler); cb8.addEventHandler(ActionEvent.ANY, actionhandler); cb9.addEventHandler(ActionEvent.ANY, actionhandler); cb10.addEventHandler(ActionEvent.ANY, actionhandler); cb11.addEventHandler(ActionEvent.ANY, actionhandler); cb12.addEventHandler(ActionEvent.ANY, actionhandler); cb13.addEventHandler(ActionEvent.ANY, actionhandler); cb14.addEventHandler(ActionEvent.ANY, actionhandler); cb15.addEventHandler(ActionEvent.ANY, actionhandler); //レイアウトの生成・設定 VBox vb = new VBox(); ObservableList<Node> lst = vb.getChildren(); lst.add(lb[0]); lst.add(scoretf); lst.add(lb[1]); lst.add(cb1); lst.add(cb2); lst.add(cb3); lst.add(cb4); lst.add(cb5); lst.add(cb6); lst.add(cb7); lst.add(cb8); lst.add(cb9); lst.add(cb10); lst.add(cb11); lst.add(cb12); lst.add(cb13); lst.add(cb14); lst.add(cb15); lst.add(lb[2]); lst.add(resultlb); vb.setPadding(new Insets(10)); vb.setSpacing(15); //シーン設定 Scene scene = new Scene(vb); //ステージ設定 stage.setScene(scene); stage.setTitle("成績計算"); //ステージ表示 stage.show(); } //イベントハンドラクラスの宣言 private class MyEventHandler implements EventHandler<ActionEvent> { public void handle(ActionEvent e) { CheckBox cb1 = (CheckBox)e.getTarget(); CheckBox cb2 = (CheckBox)e.getTarget(); CheckBox cb3 = (CheckBox)e.getTarget(); CheckBox cb4 = (CheckBox)e.getTarget(); CheckBox cb5 = (CheckBox)e.getTarget(); CheckBox cb6 = (CheckBox)e.getTarget(); CheckBox cb7 = (CheckBox)e.getTarget(); CheckBox cb8 = (CheckBox)e.getTarget(); CheckBox cb9 = (CheckBox)e.getTarget(); CheckBox cb10 = (CheckBox)e.getTarget(); CheckBox cb11 = (CheckBox)e.getTarget(); CheckBox cb12 = (CheckBox)e.getTarget(); CheckBox cb13 = (CheckBox)e.getTarget(); CheckBox cb14 = (CheckBox)e.getTarget(); CheckBox cb15 = (CheckBox)e.getTarget(); TextField scoretf = (TextField)e.getTarget(); double score = 0; double kadai_seiseki = 0; score = Double.parseDouble(scoretf.getText()); try{ if(cb1.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb2.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb3.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb4.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb5.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb6.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb7.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb8.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb9.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb10.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb11.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb12.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb13.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb14.isSelected()){ kadai_seiseki += (score / 15.0); } if(cb15.isSelected()){ kadai_seiseki += (score / 15.0); } }catch(NumberFormatException ee){ } resultlb.setText("" + kadai_seiseki); } } public static void main(String[] args) { launch(args); } } ```
jimbe

2023/01/29 18:06

コメント欄は ``` 等のマークダウンは使えません。 コードは質問本文に追加する形にしてください。 ただ、本文は 1 万文字しか入りませんので…。
komattasan

2023/01/29 18:09

入れ方がわからないのでどうにか短くできるか頑張ってみます。
guest

回答1

0

ベストアンサー

java.lang.NullPointerException: Children: child node is null: parent = VBox@49b8164b

発生しているのはヌルポであり、場所は

Otameshi.start(Otameshi.java:106)

です。
提示されているコードでは 106 行目はコメントですので、例外発生時のコードでは無いということでしょうか。

まぁ、レイアウトに設定している何処かな変数が null だろうと見てみますと…

lst.add(resultlb);

の resultlb が null なようです。


イベントハンドラをラムダ式にしたり、計算クラスを作ったり、各オブジェクトの生成順を調整したりで、チェックボックスその他を配列・フィールドや変数に入れたりが不要になったりします。

また、まだ仕方ないのかもしれませんが、

//ステージ表示 stage.show();

のようなコメントはコードを日本語訳しているだけで、コメントの意味がありません。

java

1import javafx.application.Application; 2import javafx.collections.ObservableList; 3import javafx.event.ActionEvent; 4import javafx.geometry.Insets; 5import javafx.scene.Node; 6import javafx.scene.Scene; 7import javafx.scene.control.*; 8import javafx.scene.layout.VBox; 9import javafx.stage.Stage; 10 11public class Otameshi extends Application { 12 private static final int CHECKBOX_COUNT = 15; 13 14 public static void main(String[] args) { 15 launch(args); 16 } 17 18 public void start(Stage stage) throws Exception { 19 TextField scoretf = new TextField(); 20 Label resultlb = new Label(); 21 22 Calculator calculator = new Calculator(scoretf, resultlb, CHECKBOX_COUNT); 23 scoretf.addEventHandler(ActionEvent.ANY, e -> calculator.addCount(0)); 24 25 VBox vb = new VBox(); 26 ObservableList<Node> lst = vb.getChildren(); 27 28 lst.add(new Label("課題提出の配点を入力してください")); 29 lst.add(scoretf); 30 lst.add(new Label("課題を提出した講義を選択してください")); 31 32 for(int i=0; i<CHECKBOX_COUNT; i++) { 33 CheckBox cb = new CheckBox("第"+(i+1)+"回課題"); 34 cb.setSelected(false); 35 cb.addEventHandler(ActionEvent.ANY, e -> calculator.addCount(cb.isSelected()?1:-1)); 36 lst.add(cb); 37 } 38 39 lst.add(new Label(" ")); 40 lst.add(resultlb); 41 42 vb.setPadding(new Insets(10)); 43 vb.setSpacing(15); 44 45 stage.setScene(new Scene(vb)); 46 stage.setTitle("成績計算"); 47 stage.show(); 48 } 49 50 private static class Calculator { 51 private final TextField scoretf; 52 private final Label resultlb; 53 private final int n; 54 private int count; //選択した数 55 56 Calculator(TextField scoretf, Label resultlb, int n) { 57 this.scoretf = scoretf; 58 this.resultlb = resultlb; 59 this.n = n; 60 61 count = 0; 62 resultlb.setText("0"); 63 } 64 65 void addCount(int x) { 66 count += x; 67 try { 68 double score = Double.parseDouble(scoretf.getText()); 69 resultlb.setText("" + (score * count / n)); 70 } catch(NumberFormatException ignore) { 71 resultlb.setText("score error"); 72 } 73 } 74 } 75}

実行結果
ウインドウキャプチャ画像

投稿2023/01/29 17:08

編集2023/01/29 18:14
jimbe

総合スコア12543

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

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

komattasan

2023/01/29 17:16

ありがとうございます!!!resultlbに文章をいれたところきちんとビルドできるようになりました。 実行後、チェックボックスをチェックするたび、エラーがターミナルにでるようになったのですが、やはりループでまとめるべきなのでしょうか??
jimbe

2023/01/29 17:24

>チェックボックスをチェックするたび、エラーがターミナルにでるようになった それはエラーの内容に依りますのでただエラーとだけでは何とも… ただ、15 個コピペして修正するのは、間違いが入り易い作業です。 単純に言って、プログラムが長ければ長いほど間違いが入る可能性は上がります。
komattasan

2023/01/29 17:37

そうですよね;;わかりにくくてすみません。 コードとエラーの内容を変更してまいります。
komattasan

2023/01/29 18:38

とてもわかりやすかったです;;いかに自分のコードに無駄があるかがわかりました。 jimbeさんのコードをかみ砕いて理解しようと思います。 遅い時間までいろいろとお教えいただき、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問