【JavaFX】Oracle に接続して取得したデータをTableView に表示する
おはようございます。
昨日に引き続き、
JavaFXで Oracle から取得したデータを TableView に表示したいと思います。
プログラムは前回のものを流用します。
スポンサーリンク
クラスの作成
パッケージ・エクスプローラーから「dto」パッケージを右クリックし「新規」>「クラス」を選択します。
クラス名に「TblCat」を入力し、「完了」ボタンをクリックします。
作成したクラスの実装は次のようにします。
TblCat.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | /** * */ packagejp.co.doraxdora.dto; importjava.io.Serializable; importjavafx.beans.property.SimpleStringProperty; importjavafx.beans.property.StringProperty; /** * TBL猫DTOクラス. * * @author doraxdora * */ publicclassTblCatimplementsSerializable{ /** No */ privateStringProperty no; /** 名前 */ privateStringProperty name; /** 性別 */ privateStringProperty sex; /** 年齢 */ privateStringProperty age; /** 種別 */ privateStringProperty kindCd; /** 好物 */ privateStringProperty favorite; /** * @return no */ publicStringProperty noProperty(){ returnno; } /** * @param no * セットする no */ publicvoidsetNo(Stringno){ this.no=newSimpleStringProperty(no); } /** * @return name */ publicStringProperty nameProperty(){ returnname; } /** * @param name * セットする name */ publicvoidsetName(Stringname){ this.name=newSimpleStringProperty(name); } /** * @return sex */ publicStringProperty sexProperty(){ returnsex; } /** * @param sex * セットする sex */ publicvoidsetSex(Stringsex){ this.sex=newSimpleStringProperty(sex); } /** * @return age */ publicStringProperty ageProperty(){ returnage; } /** * @param age * セットする age */ publicvoidsetAge(Stringage){ this.age=newSimpleStringProperty(age); } /** * @return kind */ publicStringProperty kindCdProperty(){ returnkindCd; } /** * @param kind * セットする kind */ publicvoidsetKindCd(StringkindCd){ this.kindCd=newSimpleStringProperty(kindCd); } /** * @return favorite */ publicStringProperty favoriteProperty(){ returnfavorite; } /** * @param favorite * セットする favorite */ publicvoidsetFavorite(Stringfavorite){ this.favorite=newSimpleStringProperty(favorite); } } |
TblViewの仕組み上
通常のアクセサとは異なり、getter のメソッド名は [メンバ名]Property とします。
こうしておかないと一覧にデータが表示されずにあたふたしますよ。
プログラム修正
画面の修正
SceneBuilder からであれば、右側のメニューから「On Action」にメソッド名を設定しますが、
fxmlを直接修正しても問題ありません。
Smaple.fxml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <?xml version="1.0"encoding="UTF-8"?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.ComboBox?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.TableColumn?> <?import javafx.scene.control.TableView?> <?import javafx.scene.control.TextField?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.control.cell.PropertyValueFactory?> <AnchorPane fx:id="mainPane"maxHeight="-Infinity"maxWidth="-Infinity"minHeight="-Infinity"minWidth="-Infinity"prefHeight="350.0"prefWidth="530.0"xmlns="http://javafx.com/javafx/8.0.111"xmlns:fx="http://javafx.com/fxml/1"fx:controller="application.SampleController"> <children> <Label fx:id="lbName"layoutX="14.0"layoutY="33.0"text="名前:" /> <TextField fx:id="txName"layoutX="58.0"layoutY="29.0" /> <Label fx:id="lbKind"layoutX="221.0"layoutY="33.0"text="種別:" /> <ComboBox fx:id="cbKind"layoutX="264.0"layoutY="29.0"prefWidth="150.0" /> <Button fx:id="btSearch"layoutX="456.0"layoutY="29.0"mnemonicParsing="false"onAction="#btSearchButtonActionHandle"text="検索" /> <TableView fx:id="tvCat"layoutX="14.0"layoutY="63.0"prefHeight="273.0"prefWidth="500.0"> <columns> <TableColumn maxWidth="50.0"minWidth="50.0"prefWidth="50.0"resizable="false"text="No"> <cellValueFactory><PropertyValueFactory property="no"/></cellValueFactory> </TableColumn> <TableColumn maxWidth="100.0"minWidth="100.0"prefWidth="100.0"text="名前" > <cellValueFactory><PropertyValueFactory property="name"/></cellValueFactory> </TableColumn> <TableColumn maxWidth="40.0"minWidth="40.0"prefWidth="40.0"text="性別" > <cellValueFactory><PropertyValueFactory property="sex"/></cellValueFactory> </TableColumn> <TableColumn maxWidth="40.0"minWidth="40.0"prefWidth="40.0"text="年齢" > <cellValueFactory><PropertyValueFactory property="age"/></cellValueFactory> </TableColumn> <TableColumn minWidth="120.0"prefWidth="120.0"text="種別" > <cellValueFactory><PropertyValueFactory property="kindCd"/></cellValueFactory> </TableColumn> <TableColumn minWidth="145.0"prefWidth="147.0"text="好物" > <cellValueFactory><PropertyValueFactory property="favorite"/></cellValueFactory> </TableColumn> </columns> <columnResizePolicy> <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> </columnResizePolicy> </TableView> </children> </AnchorPane> |
CSSの修正
1 2 3 4 | /* JavaFX CSS - Leave this comment until you have at least create one rule which uses -fx-Property */ .root { -fx-font-family:"Meiryo"; } |
TableViewの型を変更
SampleController.java
クラスに定義されているメンバーの型を新規作成した TblCat に変更します。
1 2 3 | /** テーブルビュー:一覧 */ @FXML privateTableView<TblCat>tvCat; |
検索ボタンクリック時のメソッドを追加
SampleController.java(メソッドのみ抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /** * 検索ボタンアクションハンドラー. * * @param ev */ @FXML publicvoidbtSearchButtonActionHandle(ActionEvent ev){ try{ DBAccess dba=newDBAccess(); ResultSet rs=dba.executeQuery("SELECT * FROM TBLCAT ORDER BY NO"); // 取得したデータを追加 ObservableList<TblCat>list=FXCollections.observableArrayList(); while(rs!=null&& rs.next()) { TblCat cat = new TblCat(); cat.setNo(rs.getString("NO")); cat.setName(rs.getString("NAME")); cat.setSex(rs.getString("SEX")); cat.setAge(rs.getString("AGE")); cat.setKindCd(rs.getString("KIND_CD")); cat.setFavorite(rs.getString("FAVORITE")); list.add(cat); } tvCat.setItems(list); }catch(SQLExceptione){ // TODO 自動生成された catch ブロック e.printStackTrace(); }catch(Exceptione){ // TODO 自動生成された catch ブロック e.printStackTrace(); } } |
起動してみる
起動後、検索ボタンをクリックします。
無事にデータが表示されました。
まとめ
とりあえず検索の条件などは無視してデータを表示してみました。
次回は、検索条件の設定などをやっていきたいと思います。
ではでは。
ディスカッション
コメント一覧
Javaを勉強し始めて本当数日しか経っていないものです。
大変親切に解説頂いている点が気に入りまして 参考にさせて頂いております。
差し支えなければ・お時間に余裕がございましたら 紹介されている記事についてご教示を頂けませんでしょうか?お返事を頂けたら 超助かります!
当方以下の流れでJavaFXの記事について、実際自分の端末で試させて頂いています。
(徐々にステップアップしていく流れですね)
1.【JavaFX】eclipseにJavaFXプラグインをインストールして Hello World してみる
2.【JavaFX】さくっとコンボボックスに項目を設定してみる
3.【JavaFX】Oracleに接続して取得したデータをコンボボックスに設定する
さて、4.【JavaFX】Oracle に接続して取得したデータをTableView に表示する
に突入しましたが、Scene Builder上で TableViewの列と、コントロールの列を関連付ける操作が分からなくて頭を悩ましています。
仕上がったSmaple.fxmlのコードをご紹介頂いておりますが、どういった操作から
・最初の import javafx.scene.control.cell.PropertyValueFactory が生成されるのか?
・各列の定義、 が生成されるのか?
が分かりません。
これは もはやScene Builder上の操作から生成されたコードではないのでしょうか?
直接fxmlのファイルをEclipse上で修正するほかないのでしょうか?
それと…コントローラのコードについても 2点ほど教えて頂きたいのですが…。
現在手元で作成したコントローラが、Eclipse上でSyntaxエラーを招いている状態です。
・上記の流れ1/2/3 とステップアップしてきた流れで習得している場合、まだjavafx.event.ActionEvent; がimportされていません。
これをimportする 想定でbtSearchButtonActionHandle(ActionEvent ev)のメソッドが紹介されておりますか?
コントロールの最初に、import javafx.event.ActionEvent; と記載したら1点目のエラーが消えたので....
2点目ですが、
try{}の中にある tvCat.setItems(list); の部分で下記エラーが表示されています。
“型 TableView のメソッド setItems(ObservableList) は引数 (ObservableList) に適用できません”
1/2/3の流れで進めてきてている場合、変数の定義が @FXML private TableView tvCat; のままですが
こちらを やはり変更しなければ ならない、ということでしょうか??
訳もわからず ためしに としてみたところ 一応エラーは消えたようにみえますが 正しい修正でしょうか...
すみません、自分のコメントを読み返したら自分が入力したタグの入力が消えていることに気が付きました。
fxml内でcellValueFactory PropertyValueFactory property=”XX”を生成するScene Builderの操作方法を知りたいです。
それと、コントローラのtvCatのジェリクス<>が 現在stringのままになっているが、何か変えることで このエラーは消えるのか? という問合せになります。
よろしくお願いします。
JavaFxを利用したプログラムを記述したいと思い、ブログを参考にさせていただいています。
そこで拝見していた”【JavaFX】Oracleに接続して取得したデータをコンボボックスに設定する”の記事が”サイトに技術的な問題が発生しています。”と表示され内容を見ることができないような状態となっております。
是非とも参考にしたいと考えているため、復旧のほうをお願いできないでしょうか。
kara 様
ブログを見ていただきありがとうございます。
記事の件、修正してみましたのでご確認ください。
よろしくお願いします。