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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

1回答

3660閲覧

JavaFXで、共通化したSQL実行から取得した表をTableViewに表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaFX

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2019/09/03 07:39

編集2022/01/12 10:55

JavaFXで、共通化したSQL実行から取得した表をTableViewに表示させたい

前提・実現したいこと

postgeSQLとJavaFXを使って様々なデータを参照、登録できるようなシステムを作ろうとしています。
DBへの接続は共通化しており、SQLの実行も共通化しています(書き方が怪しいですが)

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

以下のmakerControlクラスのshowTableメソッドでエラーが発生しています。
DBから取得した表(ObservableList)をTableViewへセットする際に発生しているようですが、デバッグモードで見ても表に値は入っているようです。
どういった原因が考えられるでしょうか。

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at com.stockon.maker.makerControl.showTable(makerControl.java:116) (以下略)

該当のソースコード

長くなりますので、関係ない箇所は省略しています。

Java

1public class makerModel { 2 3 private String makerName; 4 private String makerNameShort; 5 private String makerComment; 6 7 public makerModel(String name, String nameShort, String comment) { 8 this.makerName = name; 9 this.makerNameShort = nameShort; 10 this.makerComment = comment; 11 } 12}

Java

1public class makerControl extends Application { 2 3 // 画面項目 4 @FXML 5 private TableView<makerModel> tableView; 6 @FXML 7 public static TableColumn<makerModel, String> fxMakerName; 8 @FXML 9 public static TableColumn<makerModel, String> fxMakerNameShort; 10 @FXML 11 public static TableColumn<makerModel, String> fxMakerComment; 12 13 public static ObservableList<makerModel> tableMaker = FXCollections.observableArrayList(); 14 15 @Override 16 public void start(Stage stage) throws SQLException, ClassNotFoundException { 17 try { 18 // FXMLのレイアウトをロード 19 AnchorPane root = FXMLLoader.load(getClass().getResource("makerView.fxml")); 20 21 // シーン生成 22 Scene scene = new Scene(root); 23 24 // タイトルセット 25 stage.setTitle("makerView"); 26 stage.setScene(scene); 27 28 showTable(stage); 29 30 stage.show(); 31 32 } catch (IOException ex) { 33 Logger.getLogger(makerControl.class.getName()).log(Level.SEVERE, null, ex); 34 } 35 } 36 37 public void showTable(Stage stage) throws SQLException, ClassNotFoundException { 38 39 String makerName = ""; 40 String makerNameShort = ""; 41 String makerComment = ""; 42 43 makerModel mm = new makerModel(); 44 45 // SQLを実行してList<Object>型で格納する 46 List<Object> arrayData = utilDB.executeSelectQuery("SELECT \"makerName\", \"makerNameShort\", \"makerComment\" FROM st_maker"); 47 48 // List型→配列型 49 Object[] obj = arrayData.toArray(); 50 51 int rowCount = arrayData.size(); 52 for (int i = 0; i < rowCount; i++) { 53 String[] rowStr = new String[3]; 54 rowStr = (String[]) obj[i]; 55 56 //一行ずつ読み込む 57 for (int col = 0; col < rowStr.length; col++) { 58 // nullの場合は空文字に置き換える 59 if (null == rowStr[col]) { 60 rowStr[col] = ""; 61 } 62 switch (col) { 63 case 0: 64 System.out.println("MakerName():" + rowStr[col]); 65 makerName = rowStr[col]; 66 break; 67 case 1: 68 System.out.println("makerNameShort():" + rowStr[col]); 69 makerNameShort = rowStr[col]; 70 break; 71 case 2: 72 System.out.println("makerComment():" + rowStr[col]); 73 makerComment = rowStr[col]; 74 break; 75 } 76 } 77 // 一行ずつObservableListに追加する 78 tableMaker.add(new makerModel(makerName, makerNameShort, makerComment)); 79 } 80 // TableViewに一覧をセットする 81 tableView.itemsProperty().setValue(tableMaker); // Line 116:ここでエラーが発生 82 83 fxMakerName.setCellValueFactory(new PropertyValueFactory<makerModel,String>(makerName)); 84 fxMakerNameShort.setCellValueFactory(new PropertyValueFactory<makerModel,String>(makerNameShort)); 85 fxMakerComment.setCellValueFactory(new PropertyValueFactory<makerModel,String>(makerComment)); 86 } 87}

Java

1 2 public static List<Object> executeSelectQuery(String sql) throws SQLException, ClassNotFoundException { 3 4 // DBに接続する 5 connect(); 6 7 // SQLの発行 8 resultSet = statement.executeQuery(sql); 9 10 // 値の取得 11 // フィールド一覧を取得 12 List<String> resultList = new ArrayList<String>(); 13 14 List<Object> list = new ArrayList<Object>(); 15 16 ResultSetMetaData data = resultSet.getMetaData(); 17 int colCount = data.getColumnCount(); 18 for (int i = 1; i <= colCount; i++) { 19 resultList.add(data.getColumnName(i)); 20 } 21 22 //結果の出力 23 int rowCount = 0; 24 while (resultSet.next()) { 25 26 String[] ColArray = new String[colCount]; 27 28 int col = 0; 29 for (String field : resultList) { 30 System.out.println(field + ":" + resultSet.getString(field)); 31 ColArray[col] = resultSet.getString(field); 32 col++; 33 } 34 list.add(rowCount, ColArray); 35 rowCount++; 36 } 37 // DB切断 38 close(); 39 return list; 40 }

FXML

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.Button?> 4<?import javafx.scene.control.TableColumn?> 5<?import javafx.scene.control.TableView?> 6<?import javafx.scene.layout.AnchorPane?> 7 8<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="maker.makerControl"> 9 <children> 10 <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="400.0" prefWidth="600.0"> 11 <children> 12 <TableView fx:id="fxTableView" layoutX="33.0" layoutY="52.0" prefHeight="296.0" prefWidth="534.0"> 13 <columns> 14 <TableColumn fx:id="fxMakerName" prefWidth="174.0" text="メーカー名" /> 15 <TableColumn fx:id="fxMakerNameShort" prefWidth="93.0" text="略称" /> 16 <TableColumn fx:id="fxMakerComment" prefWidth="266.0" text="備考" /> 17 </columns> 18 </TableView> 19 </children> 20 </AnchorPane> 21 <Button fx:id="fxOK" layoutX="523.0" layoutY="361.0" mnemonicParsing="false" onAction="#btnAction" text="F12 保存" /> 22 <Button fx:id="fxCancel" layoutX="461.0" layoutY="361.0" mnemonicParsing="false" text="F9 取消" /> 23 </children> 24</AnchorPane> 25

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

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

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

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

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

Orlofsky

2019/09/03 07:41

ここの掲示板では丸投げはご遠慮ください。
guest

回答1

0

tableView.itemsProperty().setValue(tableMaker);

tableView.setItems(tableMaker);

にしたらいいような気がします。

参考にどうぞ
http://pineplanter.moo.jp/non-it-salaryman/2018/04/01/javafx-tableview/

投稿2019/09/04 04:19

ababa_Sigrun

総合スコア279

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

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

退会済みユーザー

退会済みユーザー

2019/09/08 07:04

Ryosuke_Hata様、お返事が遅くなり申し訳ございません。回答ありがとうございます。 参考URLを読みながら再度ソースコードを修正しましたらエラーは解消されました。 しかし、TableViewに値が反映されず「表に中身がありません」と表示されてしまいます。 参考URLのプログラムを試しに動かしてみたのですが、ビルドエラーが発生して実行できません。コピーできなかった部分と言えばFXMLのコードですので、参考プログラムも私のプログラムもFXMLに問題があるような気がしています。 つきましてはFXMLを質問に追記させていただきました。引き続き色々と調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問