🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
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で作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

データベース

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

Q&A

解決済

1回答

1367閲覧

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

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で作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

データベース

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

0グッド

0クリップ

投稿2020/11/26 15:10

ご覧いただき誠にありがとうございます。Java初学者です。

丸3日かけて、海外サイトも渡り歩き、あらゆる方法を模索してきたつもりですが、
実装できず非常に困っております。
どなたかお助け頂けないでしょうか。どんなアドバイスでも歓迎いたします。

前提・実現したいこと

JavaFXにてMySQLと連携させたデスクトップアプリを製作しています。
通常のカラム数が固定されたTableViewでの表示の実装経験はありますが、今回は
MySQLから取得するあらゆるカラム数のデータを、TableViewで動的に表示させたいと考えています。

(ユーザーに、複数の検索条件の中から任意のものを選択してもらい、それぞれのデータ結果のカラム数に応じてカラム数を自動で変え、表示させたいです。)

今回参考にしたのがこちらです。
Updated: Dynamic TableView Data From Database

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

検索を実行してもTableViewに表示されません。
イメージ説明

ちなみに特にエラーは出ませんが、Eclipseのエディター上で

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

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

該当のソースコード

すべてのコードを掲載すべきかと思いましたが、クラス数や無関係と思われるメソッドが多いため、
ここでは該当のクラスとメソッド、fxmlの掲載にさせて頂きます。
もし必要でしたら追加掲載させて頂きます。

※なお、今回の動作表示の動作確認を優先しているため、
コンボボックスの選択肢の読み取りや、対応するSQL文の実装は、現時点で未完了です。
ご了承ください。

### MySQLDao(データベース接続クラス)

Java

1package mysql; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8import java.sql.Statement; 9import java.time.LocalDate; 10import controller.TableViewItem; 11import javafx.collections.FXCollections; 12import javafx.collections.ObservableList; 13 14import javafx.beans.property.SimpleStringProperty; 15import javafx.beans.value.ObservableValue; 16import javafx.scene.control.TableColumn; 17import javafx.scene.control.TableColumn.CellDataFeatures; 18import javafx.scene.control.TableView; 19import javafx.util.Callback; 20 21public class MySQLDao { 22 23 private static final String url = "jdbc:mariadb://localhost:3306/pocketmoney?"; 24 private static final String user = "root"; 25 private static final String password = "root"; 26 27 //”支出”履歴画面のTableViewに表示させるデータの取得 28 public ObservableList<ObservableList> searchTableViewPays(/*String searchWord*/) throws SQLException { 29 30 ObservableList<ObservableList> data; 31 TableView tableview = new TableView(); 32 33 final String SUM_QUERY = "SELECT paid_at, SUM(money) FROM pays GROUP BY paid_at;"; 34 35 36 data = FXCollections.observableArrayList(); 37 try {Connection conn = DriverManager.getConnection(url, user, password); 38 ResultSet rs = conn.createStatement().executeQuery(SUM_QUERY); 39 40 for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) { 41 42 final int j = i; 43 TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i + 1)); 44 45 col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList, String>, ObservableValue<String>>() { 46 47 public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) { 48 49 System.out.println(param); 50 System.out.println(param.getValue()); 51 System.out.println(param.getValue().get(j)); 52 53 return new SimpleStringProperty(param.getValue().get(j).toString()); 54 } 55 56 }); 57 58 tableview.getColumns().addAll(col); 59 System.out.println("Column [" + i + "] "); 60 } 61 62 while(rs.next()){ 63 ObservableList<String> row = FXCollections.observableArrayList(); 64 for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) { 65 row.add(rs.getString(i)); 66 } 67 System.out.println("Row [1] added " + row); 68 data.add(row); 69 } 70 }catch(SQLException e) { 71 System.out.println("SQLException:" + e.getMessage()); 72 e.printStackTrace(); 73 } 74 return data; 75 } 76} 77 78

PaysReportController(コントローラークラス)

Java

1package controller; 2 3import java.io.IOException; 4import java.net.URL; 5import java.sql.SQLException; 6import java.util.ResourceBundle; 7import javafx.fxml.Initializable; 8import javafx.event.ActionEvent; 9import javafx.fxml.FXML; 10import javafx.fxml.FXMLLoader; 11import javafx.scene.Node; 12import javafx.scene.Parent; 13import javafx.scene.Scene; 14import javafx.scene.control.Button; 15import javafx.scene.control.ComboBox; 16import javafx.scene.control.TableView; 17import javafx.stage.Stage; 18import javafx.stage.Window; 19import mysql.MySQLDao; 20 21public class PaysReportController implements Initializable{ 22 @FXML 23 private TableView table; 24 25 @FXML 26 private ComboBox<String> cbBox; 27 28 @FXML 29 private Button SearchButton; 30 31 @FXML 32 private Button Homebutton; 33 34 @Override 35 public void initialize(URL location, ResourceBundle resources) { 36 37 } 38 39 @FXML 40 void onSearchButton(ActionEvent event) { 41 42 //コンボボックスで選択された条件をDaoに渡し、結果をTableViewに動的に表示させる 43 try { 44 MySQLDao mysq = new MySQLDao(); 45 table.setItems(mysq.searchTableViewPays()); 46 } catch(SQLException e) { 47 System.out.println("SQLException:" + e.getMessage()); 48 e.printStackTrace(); 49 } 50 51 } 52 53 @FXML 54 void onHomeButtonCliked(ActionEvent event) { 55 /* 56 * 現在表示されている画面を閉じる 57 */ 58 Scene s = ((Node)event.getSource()).getScene(); 59 Window window = s.getWindow(); 60 window.hide(); 61 62 //画面遷移 63 try { 64 FXMLLoader loader = new FXMLLoader(getClass().getResource("/Main.fxml")); 65 loader.setController(new MainController()); 66 Parent root = loader.load(); 67 Scene scene = new Scene(root); 68 69 Stage stage = new Stage(); 70 stage.setTitle("お小遣い管理アプリ"); 71 stage.setScene(scene); 72 stage.show(); 73 }catch(IOException e) { 74 e.printStackTrace(); 75 } 76 } 77}

fxml

fxml

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import java.lang.String?> 4<?import javafx.collections.FXCollections?> 5<?import javafx.geometry.Rectangle2D?> 6<?import javafx.scene.control.Button?> 7<?import javafx.scene.control.ComboBox?> 8<?import javafx.scene.control.Label?> 9<?import javafx.scene.control.TableView?> 10<?import javafx.scene.image.Image?> 11<?import javafx.scene.image.ImageView?> 12<?import javafx.scene.layout.AnchorPane?> 13<?import javafx.scene.layout.Pane?> 14<?import javafx.scene.text.Font?> 15 16<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" 17 minHeight="-Infinity" minWidth="-Infinity" prefHeight="592.0" 18 prefWidth="488.0" style="-fx-background-color: z;" 19 xmlns="http://javafx.com/javafx/11.0.1" 20 xmlns:fx="http://javafx.com/fxml/1" 21 fx:controller="controller.PaysReportController"> 22 <children> 23 <Pane prefHeight="80.0" prefWidth="650.0" 24 style="-fx-background-color: #ffbf00;" AnchorPane.leftAnchor="0.0" 25 AnchorPane.rightAnchor="0.0"> 26 <children> 27 <Label layoutX="109.0" layoutY="17.0" prefHeight="47.0" 28 prefWidth="271.0" text="  これまでの支出" textFill="#979797"> 29 <font> 30 <Font size="32.0" /> 31 </font> 32 </Label> 33 <ImageView fitHeight="37.0" fitWidth="41.0" 34 layoutX="101.0" layoutY="-31.0" pickOnBounds="true" 35 preserveRatio="true" x="30.0" y="50.0"> 36 <image> 37 <Image url="@../images/search.png" /> 38 </image> 39 <viewport> 40 <Rectangle2D /> 41 </viewport> 42 </ImageView> 43 </children> 44 </Pane> 45 <TableView fx:id="table" layoutX="80.0" layoutY="191.0" 46 prefHeight="291.0" prefWidth="329.0" AnchorPane.bottomAnchor="110.0" 47 AnchorPane.leftAnchor="80.0" AnchorPane.rightAnchor="79.0" 48 AnchorPane.topAnchor="191.0" /> 49 <Button fx:id="Homebutton" layoutX="553.0" layoutY="628.0" 50 mnemonicParsing="false" onAction="#onHomeButtonCliked" 51 prefHeight="47.0" prefWidth="51.0" 52 style="-fx-background-color: #ffbf00;" textFill="WHITE" 53 AnchorPane.bottomAnchor="34.0" AnchorPane.rightAnchor="38.0"> 54 <font> 55 <Font size="19.0" /> 56 </font> 57 <graphic> 58 <ImageView fitHeight="40.0" fitWidth="33.0" 59 onDragDetected="#onHomeButtonCliked" pickOnBounds="true" 60 preserveRatio="true" x="30.0" y="50.0"> 61 <image> 62 <Image url="@../images/home.png" /> 63 </image> 64 <viewport> 65 <Rectangle2D /> 66 </viewport> 67 </ImageView> 68 </graphic> 69 </Button> 70 <ComboBox fx:id="cbBox" layoutX="107.0" layoutY="115.0" 71 prefHeight="30.0" prefWidth="214.0" AnchorPane.bottomAnchor="440.0" 72 AnchorPane.leftAnchor="107.0"> 73 <items> 74 <FXCollections fx:factory="observableArrayList"> 75 <String fx:value="日ごとにいくら使ったか" /> 76 <String fx:value="カテゴリーごとの合計額" /> 77 <String fx:value="総合計額" /> 78 <String fx:value="3000円以上の支出" /> 79 <String fx:value="これまでで一番高い支出" /> 80 </FXCollections> 81 </items> 82 </ComboBox> 83 <Button fx:id="SearchButton" layoutX="357.0" layoutY="115.0" 84 mnemonicParsing="false" onAction="#onSearchButton" prefHeight="30.0" 85 prefWidth="52.0" text="検索" AnchorPane.bottomAnchor="440.0" 86 AnchorPane.leftAnchor="357.0" /> 87 </children> 88</AnchorPane> 89

試したこと

私なりに原因として疑っているのは以下2点です。

①PaysReportControllerクラス内に実行されないメソッドがある

PaysReportController

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

この部分が実行されません。

December 21, 2016 at 9:16 pm
Add this:
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

こちらを参考に試しましたが、肝心のデータベースとの関連付けの記載がなかったため実装できませんでした。

JavaDocも見ましたが、
元々参考にしているUpdated: Dynamic TableView Data From Database
以上の具体的な実装方法は見つけられませんでした。

参考ベースにしているこちらのクラス構造と違い、
私の

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

自己解決

アップロードエラーにより、本来アップロードしたい内容が反映されておらず、
また、編集しようにも明らかに文字数制限内にも関わらず文字数制限がかかり再編集できないため、
誤った質問内容で誤解を与えてしまってはいけませんので、ひとまず自己解決済みとさせて下さい。
本来の質問は別途上げます。
申し訳ございません。

テラテイル事務局に報告します。

投稿2020/11/26 15:24

javafuku

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問