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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JavaFX

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

Java

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

受付中

【JavaFX】MySQLから取得するあらゆるカラム数のデータを、TableViewで動的に表示させたい

javafuku
javafuku

総合スコア1

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JavaFX

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

Java

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

1回答

0リアクション

0クリップ

2060閲覧

投稿2020/11/26 15:35

ご覧いただき誠にありがとうございます。Java初学者です。
丸3日かけ、あらゆる方法を模索してきたつもりですが、
スキルが不足しており実装できず非常に困っております。
どなたかお助け頂けないでしょうか。どんなアドバイスでも歓迎いたします。

前提・実現したいこと

JavaFXとSceneBuilderにてMySQLと連携させたデスクトップアプリを製作しています。
MySQLから取得するあらゆるカラム数のデータを、TableViewで動的に表示させたいと考えています。
(ユーザーに、複数の検索条件の中から任意のものを選択してもらい、それぞれのデータ結果のカラム数に応じてカラム数を自動で変え、表示させたいです。)
今回参考にしたのがこちらです。

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

検索を実行してもTableViewに表示されません。
イメージ説明
ちなみに特にエラーは出ませんが、Eclipseのエディター上で警告は出ます。

- ObservableList は raw 型です。総称型 ObservableList<E> への参照は、パラメーター化する必要があります
型の安全性: メソッド setCellValueFactory(Callback) は raw 型 TableColumn に属しています。総称型 TableColumn<S,T> への参照はパラメーター化される必要があります

しかし直接的な原因ではないのではと考えています。

該当のソースコード

※文字数制限のため、不要と思われる部分は添削しています。(全文は後述のGitHubリンクをご覧ください。)
※なお、今回は動作表示の実装を優先しているため、
コンボボックスの選択肢の読み取りや、対応するSQL文の実装は、現時点で未完了です。
##### MySQLDaoクラス(データベース接続・SQL文を一括管理)
該当部分は28~58行目のsearchTableViewPays()メソッドです。

Java

package mysql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.time.LocalDate; import controller.TableViewItem; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; import javafx.scene.control.TableColumn; import javafx.scene.control.TableColumn.CellDataFeatures; import javafx.scene.control.TableView; import javafx.util.Callback; public class MySQLDao { private static final String url = "jdbc:mariadb://localhost:3306/pocketmoney?"; private static final String user = "root"; private static final String password = "root"; //”支出”履歴画面のTableViewに表示させるデータの取得 public ObservableList<ObservableList> searchTableViewPays() throws SQLException { ObservableList<ObservableList> data; data = FXCollections.observableArrayList(); TableView tableview = new TableView(); final String SUM_QUERY = "SELECT paid_at, SUM(money) FROM pays GROUP BY paid_at;";//テストクエリ try {Connection conn = DriverManager.getConnection(url, user, password); ResultSet rs = conn.createStatement().executeQuery(SUM_QUERY); for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) { final int j = i; TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i + 1)); col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList, String>, ObservableValue<String>>() { public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) { return new SimpleStringProperty(param.getValue().get(j).toString()); } }); tableview.getColumns().addAll(col); System.out.println("Column [" + i + "] "); } while(rs.next()){ ObservableList<String> row = FXCollections.observableArrayList(); for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) { row.add(rs.getString(i)); } System.out.println("Row [1] added " + row); data.add(row); } }catch(SQLException e) { System.out.println("SQLException:" + e.getMessage()); e.printStackTrace(); } return data; } }
PaysReportController(コントローラークラス)

該当部分は49~62行目のonSearchButton(ActionEvent event)メソッドです

Java

package controller; import java.io.IOException; import java.net.URL; import java.sql.SQLException; import java.util.ResourceBundle; import javafx.fxml.Initializable; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.TableView; import javafx.stage.Stage; import javafx.stage.Window; import mysql.MySQLDao; public class PaysReportController implements Initializable{ @FXML private TableView table; @FXML private ComboBox<String> cbBox; @FXML private Button SearchButton; @FXML private Button Homebutton; @Override public void initialize(URL location, ResourceBundle resources) { } @FXML void onSearchButton(ActionEvent event) { //コンボボックスで選択された条件をDaoに渡し、結果をTableViewに動的に表示させる try { MySQLDao mysq = new MySQLDao(); table.setItems(mysq.searchTableViewPays()); } catch(SQLException e) { System.out.println("SQLException:" + e.getMessage()); e.printStackTrace(); } } @FXML void onHomeButtonCliked(ActionEvent event) { /* * 現在表示されている画面を閉じる */ Scene s = ((Node)event.getSource()).getScene(); Window window = s.getWindow(); window.hide(); //画面遷移 try { FXMLLoader loader = new FXMLLoader(getClass().getResource("/Main.fxml")); loader.setController(new MainController()); Parent root = loader.load(); Scene scene = new Scene(root); Stage stage = new Stage(); stage.setTitle("お小遣い管理アプリ"); stage.setScene(scene); stage.show(); }catch(IOException e) { e.printStackTrace(); } } }
PaysReport.fxml

fxml

<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.String?> <?import javafx.collections.FXCollections?> <?import javafx.geometry.Rectangle2D?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.ComboBox?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.TableView?> <?import javafx.scene.image.Image?> <?import javafx.scene.image.ImageView?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.Pane?> <?import javafx.scene.text.Font?> <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="592.0" prefWidth="488.0" style="-fx-background-color: z;" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.PaysReportController"> <children> <Pane prefHeight="80.0" prefWidth="650.0" style="-fx-background-color: #ffbf00;" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"> <children> <Label layoutX="109.0" layoutY="17.0" prefHeight="47.0" prefWidth="271.0" text="  これまでの支出" textFill="#979797"> <font> <Font size="32.0" /> </font> </Label> <ImageView fitHeight="37.0" fitWidth="41.0" layoutX="101.0" layoutY="-31.0" pickOnBounds="true" preserveRatio="true" x="30.0" y="50.0"> <image> <Image url="@../images/search.png" /> </image> <viewport> <Rectangle2D /> </viewport> </ImageView> </children> </Pane> <TableView fx:id="table" layoutX="80.0" layoutY="191.0" prefHeight="291.0" prefWidth="329.0" AnchorPane.bottomAnchor="110.0" AnchorPane.leftAnchor="80.0" AnchorPane.rightAnchor="79.0" AnchorPane.topAnchor="191.0" /> <Button fx:id="Homebutton" layoutX="553.0" layoutY="628.0" mnemonicParsing="false" onAction="#onHomeButtonCliked" prefHeight="47.0" prefWidth="51.0" style="-fx-background-color: #ffbf00;" textFill="WHITE" AnchorPane.bottomAnchor="34.0" AnchorPane.rightAnchor="38.0"> <font> <Font size="19.0" /> </font> <graphic> <ImageView fitHeight="40.0" fitWidth="33.0" onDragDetected="#onHomeButtonCliked" pickOnBounds="true" preserveRatio="true" x="30.0" y="50.0"> <image> <Image url="@../images/home.png" /> </image> <viewport> <Rectangle2D /> </viewport> </ImageView> </graphic> </Button> <ComboBox fx:id="cbBox" layoutX="107.0" layoutY="115.0" prefHeight="30.0" prefWidth="214.0" AnchorPane.bottomAnchor="440.0" AnchorPane.leftAnchor="107.0"> <items> <FXCollections fx:factory="observableArrayList"> <String fx:value="日ごとにいくら使ったか" /> <String fx:value="カテゴリーごとの合計額" /> <String fx:value="総合計額" /> <String fx:value="3000円以上の支出" /> <String fx:value="これまでで一番高い支出" /> </FXCollections> </items> </ComboBox> <Button fx:id="SearchButton" layoutX="357.0" layoutY="115.0" mnemonicParsing="false" onAction="#onSearchButton" prefHeight="30.0" prefWidth="52.0" text="検索" AnchorPane.bottomAnchor="440.0" AnchorPane.leftAnchor="357.0" /> </children> </AnchorPane>

その他のソースコード

アプリ起動するための最低限のその他のクラスやfxmlを掲載しようとしたのですが、
文字数の関係で掲載できなかった為GitHubのリンク張ります。

必要でしたらご覧ください。

試したこと

私なりに原因として疑っているのは
【MySQLDaoクラス内に実行されないメソッドがある】という点です。
以下、MySQLDaoクラス

Java

public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {   return new SimpleStringProperty(param.getValue().get(j).toString()); }

何故かこのメソッドが実行されないのです。
参考サイトのコメント欄に同様の質問があり、

if (param.getValue().get(j) != null) {
return new SimpleStringProperty(param.getValue().get(j).toString());
} else {
return new SimpleStringProperty();
}

to the Table Colum Added Dynamically routine. Then the App doesn’t crash if the cell is empty

を追加とアドバイスがあったので試しましたが解決しませんでした。

【その他試みたこと】

  • 異なるSQLクエリでデータ取得。NULL値があるといけないのかと思い、NULL値のないテーブルでの異なるクエリも試しました。
  • JavaDocも見ましたが、具体的な解決策は見つけられませんでした。

実行環境

  • Windows: 10 Pro 64bit
  • Eclipse IDE for Java Developers: 2020-09 (4.17.0)
  • JDK: 11.0.9
  • JavaFX SDK: 15.0.1
  • e(fx)clipse version: 3.6.0
  • SceneBuilder: 2.0

以上です。情報が不足していましたら追記致します。宜しくお願い致します。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JavaFX

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

Java

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます