初めての質問投稿・プログラミング初心者ですので間違った表現などありましたら申し訳ないです。
前提・実現したいこと
JavaFXで、読書記録をつけるプログラムを作成しています。
メインクラス(OneHundredReading.java)のほかにコントローラークラス(OneHundredReadingController2.java)と本のインスタンスを作成するクラス(BookProperty.java)をつくりました。fxmlはそれ用のファイルを作成して記述しています。
本のインスタンスデータを、javaFXのTableViewを利用して表にしたいです。
発生している問題・エラーメッセージ
コントローラークラス内で
TableView<BookProperty>型のtable,
TableColumn<BookProperty, StringProperty>型のdateColumn, titleColumn, authorColumn,
ObservableList<BookProperty>型のtableRecordを用意しました。
initializeメソッド内で
table.itemsProperty().setValue(tableRecord);
table.setItems(tableRecord);
table.getItems().add(BookProperty型インスタンス)
など、tableにインスタンスの情報を流し込もうとすると、コンパイルは通るのですが実行時にエラーが出てしまいます。
Exception in Application start method java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051) Caused by: java.lang.RuntimeException: Exception in Application start method at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: javafx.fxml.LoadException: (今回利用するファイルを入れたフォルダ)/OneHundredReading.fxml at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3237) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113) at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106) at OneHundredReading.start(OneHundredReading.java:18) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428) at java.base/java.security.AccessController.doPrivileged(Native Method) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174) ... 1 more Caused by: java.lang.NullPointerException at OneHundredReadingController2.initialize(OneHundredReadingController2.java:34) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2573) ... 17 more
該当のソースコード
もっとも怪しそうなコントローラークラス
Java
1import java.net.URL; 2import java.util.ResourceBundle; 3import javafx.event.ActionEvent; 4import javafx.fxml.FXML; 5import javafx.fxml.Initializable; 6import javafx.beans.property.StringProperty; 7import javafx.beans.property.SimpleStringProperty; 8import javafx.scene.control.TableColumn; 9import javafx.scene.control.TableView; 10import javafx.scene.control.cell.PropertyValueFactory; 11import javafx.collections.FXCollections; 12import javafx.collections.ObservableList; 13 14public class OneHundredReadingController2 implements Initializable { 15 16 @FXML 17 private TableView<BookProperty> table; 18 @FXML 19 private TableColumn<BookProperty, StringProperty> dateColumn; 20 @FXML 21 private TableColumn<BookProperty, StringProperty> titleColumn; 22 @FXML 23 private TableColumn<BookProperty, StringProperty> authorColumn; 24 private ObservableList<BookProperty> tableRecord; 25 26 27 @Override 28 public void initialize(URL url, ResourceBundle rb) { 29 tableRecord = FXCollections.observableArrayList(); 30 table.itemsProperty().setValue(tableRecord);//エラーが出ます 31 table.setItems(tableRecord);//エラーが出ます 32 33 dateColumn.setCellValueFactory(new PropertyValueFactory<BookProperty, StringProperty>("title")); 34 titleColumn.setCellValueFactory(new PropertyValueFactory<BookProperty, StringProperty>("author")); 35 authorColumn.setCellValueFactory(new PropertyValueFactory<BookProperty, StringProperty>("date")); 36 37 tableRecord.add(new BookProperty("title", "author", "date")); 38 tableRecord.add(new BookProperty("title2", "author2", "date2")); 39 40 System.err.println("initialize"); 41 42 for (Object o : tableRecord) { 43 System.err.println(o.toString()); 44 } 45 46 //こちらも有効化するとエラーになります 47 //table.getItems().add(new BookProperty("testtitle", "testauthor", "testdate")); 48 49 tableRecord.addAll(new BookProperty("title3", "author3", "date3")); 50 51 } 52}
本のインスタンスクラス
※Propertyの特例の扱いがいまいちつかめなかったので、通常のセッタ・ゲッタとPropertyメソッド両方作ってあります。
Java
1import javafx.beans.property.StringProperty; 2import javafx.beans.property.SimpleStringProperty; 3 4public class BookProperty { 5 private final SimpleStringProperty title; 6 private final SimpleStringProperty author; 7 private final SimpleStringProperty date; 8 9 public BookProperty(String title, String author, String date) { 10 this.title = new SimpleStringProperty(title); 11 this.author = new SimpleStringProperty(author); 12 this.date = new SimpleStringProperty(date); 13 } 14 15 public StringProperty titleProperty() { 16 return title; 17 } 18 19 public StringProperty authorProperty() { 20 return author; 21 } 22 23 public StringProperty dateProperty() { 24 return date; 25 } 26 27 28 public String getTitle() { 29 return title.get(); 30 } 31 32 public void setTitle(String buf) { 33 title.set(buf); 34 } 35 36 public String getAuthor() { 37 return author.get(); 38 } 39 40 public void setAuthor(String buf) { 41 author.set(buf); 42 } 43 44 public String getDate() { 45 return date.get(); 46 } 47 48 public void setDate(String buf) { 49 date.set(buf); 50 } 51 52}
メインクラス
Java
1import javafx.application.Application; 2import javafx.scene.Scene; 3import javafx.scene.control.Button; 4import javafx.scene.control.Label; 5import javafx.scene.control.TextField; 6import javafx.scene.layout.BorderPane; 7import javafx.scene.layout.Pane; 8import javafx.stage.Stage; 9import javafx.fxml.FXMLLoader; 10 11public class OneHundredReading extends Application { 12 Stage stage; 13 14 @Override 15 public void start(Stage primaryStage) throws Exception { 16 stage = primaryStage; 17 primaryStage.setTitle("100Reading"); 18 Pane myPane_top = (Pane) 19 FXMLLoader.load(getClass().getResource("OneHundredReading.fxml")); 20 Scene myScene = new Scene(myPane_top); 21 primaryStage.setScene(myScene); 22 primaryStage.show(); 23 24 } 25 26 public static void main(String[] args) { 27 launch(args); 28 } 29}
字数オーバーしてしまったのでfxmlは省略します
試したこと
コントローラークラスの該当コードをコメントアウトした状態であれば実行できますし、ウィンドウも表示されます。
(もちろん表は空のままです)
指示された行数としてもNullPointerExeptionが最も怪しいと思っていて、TableColumnの指定型を変えたりしてみたのですが解決には至りませんでした。
補足情報(FW/ツールのバージョンなど)
OpenJDK11.0.1
OpenJFX11.0.2
をマージして利用しています。