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

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

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

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

Java

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

Q&A

1回答

1034閲覧

JavaFXのTableViewを利用して表を作成したい

_tamy

総合スコア10

JavaFX

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

Java

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

0グッド

1クリップ

投稿2019/02/20 04:57

初めての質問投稿・プログラミング初心者ですので間違った表現などありましたら申し訳ないです。

前提・実現したいこと

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
をマージして利用しています。

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/02/20 10:59

TableColumnとか使ったことないですが、ドキュメントと他の事例を見る限り、StringPropertyを使っている例を見かけませんでした。スタックトレース上の行番号がどうなっているのかよく分からず、例外のカラクリまでは理解できていませんが、StringPropertyだとbindingに支障があるような気もするので、Stringにしてみては? (更新用にStringProperty自体を使用している例はあったのですが、I/FはあくまでもStringのようでした)
guest

回答1

0

自作したFXMLファイルで実行したところエラーが発生せず表が表示されました。
イメージ説明
期待通りの見た目かは分かりませんがFXMLファイルになにか間違いがあるのではないかと思います(例えばfx:idが指定されていない)。

<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.TableColumn?> <?import javafx.scene.control.TableView?> <?import javafx.scene.layout.AnchorPane?> <AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="OneHundredReadingController2"> <children> <TableView fx:id="table" prefHeight="400.0" prefWidth="600.0"> <columns> <TableColumn fx:id="dateColumn" prefWidth="200.0" text="日付" /> <TableColumn fx:id="titleColumn" prefWidth="200.0" text="タイトル" /> <TableColumn fx:id="authorColumn" prefWidth="200.0" text="作者" /> </columns> </TableView> </children> </AnchorPane>

投稿2019/02/22 06:51

yazooT

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問