前提
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)
とりあえずチェックボックス15個分をやたら並べるのではなく、配列やループで纏めると多少は見通し良くなると思います。
>おそらく最新のバージョン
teratail は質問は長く残すことが目的です。質問時は最新でも数年後に見た時にはどのバージョンだか全く分かりません。
>>jimbeさん
コメントありがとうございます!!
当初はfor文を用いてループをしており、チェックボックスも配列で出していたのですが、うまくいかなかったので羅列している次第です。。。;;見通しにくくて申し訳ないです。
そうなんですね!初めての質問だったのでわかりやすく教えていただいて助かります。編集してきます。
編集有難うございます。
teratail でのやり方についてはヘルプの
teratailについて知りたい
https://teratail.com/help#about-teratail
質問する前に心がけてほしいこと
https://teratail.com/help/question-tips
等は読んで頂いておけると良いと思います。
わ!なにからなにまでありがとうございます!大変参考になります!!
### 該当のソースコード
```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);
}
}
```
コメント欄は ``` 等のマークダウンは使えません。
コードは質問本文に追加する形にしてください。
ただ、本文は 1 万文字しか入りませんので…。
入れ方がわからないのでどうにか短くできるか頑張ってみます。
回答1件
あなたの回答
tips
プレビュー
