tag:crieit.net,2005:https://crieit.net/tags/JavaFX/feed 「JavaFX」の記事 - Crieit Crieitでタグ「JavaFX」に投稿された最近の記事 2020-01-27T10:01:36+09:00 https://crieit.net/tags/JavaFX/feed tag:crieit.net,2005:PublicArticle/15698 2020-01-27T10:01:36+09:00 2020-01-27T10:01:36+09:00 https://crieit.net/posts/JavaFX-Oracle-TableView 【JavaFX】Oracle に接続して取得したデータをTableView に表示する <p>引き続き、JavaFXで Oracle から取得したデータを TableView に表示したいと思います。</p> <p>プログラムは前回のものを流用します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/09/30/post-2626/" target="_blank" rel="noopener">【JavaFX】Oracleに接続して取得したデータをコンボボックスに設定する</a></p> <h2 id="クラスの作成"><a href="#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90">クラスの作成</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxTblView000.jpg" alt="クラスの作成" /></p> <p>パッケージ・エクスプローラーから「dto」パッケージを右クリックし「新規」>「クラス」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxTblView001.jpg" alt="名前を入力" /></p> <p>クラス名に「TblCat」を入力し、「完了」ボタンをクリックします。</p> <p>作成したクラスの実装は次のようにします。</p> <p>TblCat.java</p> <pre><code>/** * */ package jp.co.doraxdora.dto; import java.io.Serializable; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; /** * TBL猫DTOクラス. * * @author doraxdora * */ public class TblCat implements Serializable { /** No */ private StringProperty no; /** 名前 */ private StringProperty name; /** 性別 */ private StringProperty sex; /** 年齢 */ private StringProperty age; /** 種別 */ private StringProperty kindCd; /** 好物 */ private StringProperty favorite; /** * @return no */ public StringProperty noProperty() { return no; } /** * @param no * セットする no */ public void setNo(String no) { this.no = new SimpleStringProperty(no); } /** * @return name */ public StringProperty nameProperty() { return name; } /** * @param name * セットする name */ public void setName(String name) { this.name = new SimpleStringProperty(name); } /** * @return sex */ public StringProperty sexProperty() { return sex; } /** * @param sex * セットする sex */ public void setSex(String sex) { this.sex = new SimpleStringProperty(sex); } /** * @return age */ public StringProperty ageProperty() { return age; } /** * @param age * セットする age */ public void setAge(String age) { this.age = new SimpleStringProperty(age); } /** * @return kind */ public StringProperty kindCdProperty() { return kindCd; } /** * @param kind * セットする kind */ public void setKindCd(String kindCd) { this.kindCd = new SimpleStringProperty(kindCd); } /** * @return favorite */ public StringProperty favoriteProperty() { return favorite; } /** * @param favorite * セットする favorite */ public void setFavorite(String favorite) { this.favorite = new SimpleStringProperty(favorite); } } </code></pre> <p> </p> <p><span style="color: #000000;">TblViewの仕組み上</span><br /> <span style="color: #000000;">通常のアクセサとは異なり、getter のメソッド名は [メンバ名]Property とします。<br /> こうしておかないと一覧にデータが表示されずにあたふたしますよ。</span></p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="画面の修正"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E4%BF%AE%E6%AD%A3">画面の修正</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxTblView002.jpg" alt="" /> メソッドの追加</p> <p>SceneBuilder からであれば、右側のメニューから「On Action」にメソッド名を設定しますが、<br /> fxmlを直接修正しても問題ありません。</p> <p>Smaple.fxml</p> <pre><code><?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> </code></pre> <h3 id="CSSの修正"><a href="#CSS%E3%81%AE%E4%BF%AE%E6%AD%A3">CSSの修正</a></h3> <p><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90z9z84zrpz78zez89zz80zz74zz70ziz73z2qz76zgqnz66z0uyz82zz89zz78zz83zhjez73zj">application.css<br /> </span></p> <pre><code> /* JavaFX CSS - Leave this comment until you have at least create one rule which uses -fx-Property */ .root { -fx-font-family: "Meiryo"; } </code></pre> <h3 id="TableViewの型を変更"><a href="#TableView%E3%81%AE%E5%9E%8B%E3%82%92%E5%A4%89%E6%9B%B4">TableViewの型を変更</a></h3> <p>SampleController.java</p> <p>クラスに定義されているメンバーの型を新規作成した TblCat に変更します。</p> <pre><code> /** テーブルビュー:一覧 */ @FXML private TableView<TblCat> tvCat; </code></pre> <h3 id="検索ボタンクリック時のメソッドを追加"><a href="#%E6%A4%9C%E7%B4%A2%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E6%99%82%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0">検索ボタンクリック時のメソッドを追加</a></h3> <p>SampleController.java(メソッドのみ抜粋)</p> <pre><code> /** * 検索ボタンアクションハンドラー. * * @param ev */ @FXML public void btSearchButtonActionHandle(ActionEvent ev) { try { DBAccess dba = new DBAccess(); ResultSet rs = dba.executeQuery("SELECT * FROM TBLCAT ORDER BY NO"); // 取得したデータを追加 ObservableList<TblCat> list = FXCollections.observableArrayList(); while (rs != null &amp;&amp; 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 (SQLException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (Exception e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxTblView003.jpg" alt="検索" /></p> <p>起動後、検索ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxTblView004.jpg" alt="データが表示される" /></p> <p>無事にデータが表示されました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>とりあえず検索の条件などは無視してデータを表示してみました。</p> <p>次回は、検索条件の設定などをやっていきたいと思います。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15694 2020-01-24T09:43:29+09:00 2020-01-24T09:43:29+09:00 https://crieit.net/posts/JavaFX-Oracle 【JavaFX】Oracleに接続して取得したデータをコンボボックスに設定する <p>前回に引き続き、JavaFXです。<br /> 今回は Oracle からデータを取得してコンボボックスに設定します。</p> <p>利用するテーブルや Oracle のインストールなどは次の記事を参照してください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/08/31/post-2304/" target="_blank" rel="noopener noreferrer">Oracle Database Express Edition 11g Release 2 のインストールからテーブル作成まで</a></p> <p>Swing でやったのとほぼほぼ同じです。</p> <p>プログラムは前回のものを流用します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/09/28/post-2615/" target="_blank" rel="noopener noreferrer">【JavaFX】コンボボックスに項目を設定する</a></p> <h2 id="ライブラリの追加"><a href="#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E8%BF%BD%E5%8A%A0">ライブラリの追加</a></h2> <p>Oracle からデータを取得するために、ライブラリを追加します。<br /> パッケージ・エクスプローラーからプロジェクトを右クリックし、「プロパティ」を開きます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb000.jpg" alt="外部 JARの追加" /></p> <p>「Javaのビルドパス」メニューを選択し、「ライブラリー」タブを表示、<br /> 「外部 JAR の追加」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb001.jpg" alt="外部ファイルの選択" /></p> <p>ファイル選択ダイアログが表示されるので、<br /> Oracle のインストールディレクトリから対象のファイルが格納されているフォルダを開きます。</p> <p>デフォルト(Oracle 11g XE)の場合は次の場所に格納されています。</p> <pre><code>C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib </code></pre> <p>ライブラリフォルダーに格納されている「ojdbc6.jar」を開きます。</p> <h2 id="パッケージの作成"><a href="#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%9C%E6%88%90">パッケージの作成</a></h2> <p>次の2つのパッケージを作成します。</p> <pre><code>jp.co.doraxdora.common jp.co.doraxdora.dto </code></pre> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb002.jpg" alt="パッケージの作成" /></p> <p>パッケージ・エクスプローラーで「src」を右クリック>「新規」>「パッケージ」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb003.jpg" alt="パッケージ名の入力" /></p> <p>名前に「jp.co.doraxdora.common」を入力して「完了」ボタンをクリックします。<br /> 同様に「jp.co.doraxdora.dto」も作成します。</p> <p> </p> <h2 id="クラスの作成"><a href="#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90">クラスの作成</a></h2> <p>次の2つのクラスをそれぞれのパッケージに作成します。</p> <pre><code>jp.co.doraxdora.common.DBAccess.java jp.co.doraxdora.dto.MstKind.java </code></pre> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb004.jpg" alt="クラスの作成" /></p> <p>パッケージ・エクスプローラーでパッケージを右クリック>「新規」>「クラス」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb005.jpg" alt="クラス名の入力" /></p> <p>名前に「DBAccess」を入力して「完了」ボタンをクリックします。<br /> 同様に「MstKind」も作成します。</p> <h3 id="実装"><a href="#%E5%AE%9F%E8%A3%85">実装</a></h3> <p>DBAccess.java</p> <pre><code> package jp.co.doraxdora.common; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.List; import oracle.jdbc.pool.OracleDataSource; /** * @author doraxdora * */ public class DBAccess { private static String DB_URL = "jdbc:oracle:thin:USER01/USER01@localhost:1521:XE"; private static Connection con = null; /** * コンストラクタ. * * @throws Exception */ public DBAccess() throws Exception{ super(); // ドライバのロード OracleDataSource ds = new OracleDataSource(); ds.setURL(DB_URL); // DB接続 con = ds.getConnection(); } /** * SQLを実行して結果を取得します. * @param sql * @return */ public ResultSet executeQuery(String sql) throws Exception { PreparedStatement stmt = con.prepareStatement(sql); return stmt.executeQuery(); } /** * パラメータを指定してSQLを実行し、結果を取得します. * * @param sql * @param param * @return * @throws Exception */ public ResultSet executeQuery(String sql, List<Object> param) throws Exception { PreparedStatement stmt = con.prepareStatement(sql); for (int i = 0; i < param.size(); i++) { if (param.get(i) instanceof String) { stmt.setString(i, (String) param.get(i)); } else if (param.get(i) instanceof Integer) { stmt.setInt(i, (int) param.get(i)); } } return stmt.executeQuery(); } } </code></pre> <p>MstKind.java</p> <pre><code>/** * */ package jp.co.doraxdora.dto; import java.io.Serializable; /** * MST種別クラス. * * @author doraxdora * */ public class MstKind implements Serializable { /** 種別コード */ private String kindCd; /** 種別名 */ private String kindName; /** * @return kindCd */ public String getKindCd() { return kindCd; } /** * @param kindCd セットする kindCd */ public void setKindCd(String kindCd) { this.kindCd = kindCd; } /** * @return kindName */ public String getKindName() { return kindName; } /** * @param kindName セットする kindName */ public void setKindName(String kindName) { this.kindName = kindName; } /* (非 Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return kindName; } } </code></pre> <p>JavaFX の ComboBox の実装が、<br /> toString()メソッドを利用して表示文字列を取得しているため、<br /> toString()メソッドをオーバーライドし、表示するメンバーの値を返すようにする必要があります。</p> <h2 id="コントローラーの修正"><a href="#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E4%BF%AE%E6%AD%A3">コントローラーの修正</a></h2> <h3 id="インポート文の追加およびメンバー型の変更"><a href="#%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E6%96%87%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%81%8A%E3%82%88%E3%81%B3%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E5%9E%8B%E3%81%AE%E5%A4%89%E6%9B%B4">インポート文の追加およびメンバー型の変更</a></h3> <p>SampleController.java(変更箇所のみ抜粋)</p> <pre><code>// インポート文追加 import jp.co.doraxdora.common.DBAccess; import jp.co.doraxdora.dto.MstKind; public class SampleController implements Initializable{ /** コンボボックス:名前 */ // String から MstKind のリストに変更 // アクセサも修正が必要 @FXML //private ComboBox<String> cbKind; private ComboBox<MstKind> cbKind; /** * @return cbKind */ public ComboBox<MstKind> getCbKind() { return cbKind; } /** * @param cbKind セットする cbKind */ public void setCbKind(ComboBox<MstKind> cbKind) { this.cbKind = cbKind; } ) </code></pre> <h3 id="初期化処理の修正"><a href="#%E5%88%9D%E6%9C%9F%E5%8C%96%E5%87%A6%E7%90%86%E3%81%AE%E4%BF%AE%E6%AD%A3">初期化処理の修正</a></h3> <p>SampleController.java(メソッドのみ抜粋)</p> <pre><code> /* * (非 Javadoc) * @see javafx.fxml.Initializable#initialize(java.net.URL, java.util.ResourceBundle) */ @Override public void initialize(URL location, ResourceBundle resources) { try { DBAccess dba = new DBAccess(); ResultSet rs = dba.executeQuery("SELECT * FROM MSTKIND ORDER BY KIND_CD"); // 指定なしを追加 MstKind empty = new MstKind(); empty.setKindCd("-1"); empty.setKindName("指定なし"); cbKind.getItems().add(empty); // 取得したデータを追加 while (rs != null &amp;&amp; rs.next()) { MstKind kind = new MstKind(); kind.setKindCd(rs.getString("KIND_CD")); kind.setKindName(rs.getString("KIND_NAME")); cbKind.getItems().add(kind); } // 初期選択状態を設定 cbKind.getSelectionModel().select(0); } catch (SQLException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (Exception e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } </code></pre> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb006.jpg" alt="起動した画面" /></p> <p>内容は前回のものと変わりませんが、<br /> 無事に表示することができました。</p> <p>次回は一覧にデータ表示するところまでやってみたいと思います。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15691 2020-01-20T09:27:40+09:00 2020-01-20T09:27:40+09:00 https://crieit.net/posts/JavaFX 【JavaFX】さくっとコンボボックスに項目を設定してみる <p>今回は、JavaFXの基本的な構成や仕組みなどを学ぶために<br /> とりあえずコンボボックスに項目を設定して選択できるようにしてみます。</p> <p>開発環境については以前の記事を参考にしてください。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/09/22/post-2584/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【JavaFX】eclipseにJavaFXプラグインをインストールして Hello World してみる</a></p> <h2 id="画面の作成"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E4%BD%9C%E6%88%90">画面の作成</a></h2> <p>画面は SceneBuilder にて作成します。<br /> (WPF で作成した画面と同等のものを作ってみたいと思います。)</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/category/dev/c/" target="_blank" rel="noopener noreferrer">WPF編はこちら</a></p> <p>初期状態では、「BorderPane」が設置されていますが、<br /> それを削除して「AnchorPane」を設置し、その上にコントロールを配置していきます。</p> <p>AnchorPane というのは、<br /> 簡単に言うとコントロールを座標(絶対位置)で配置できるレイアウトになります。</p> <p>その他のレイアウトについてはそのうち紹介できればします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxCombo000.jpg" alt="画面へコントロールを配置" /></p> <p>SceneBuilder上で CTRL + P を押すとプレビュー表示することができます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxCombo001.jpg" alt="プレビュー表示" /></p> <p>eclipse で Java プリケーションの実行をしなくても起動後の画面がサクッと表示されます。<br /> (プログラムは動かないのでコントロールの位置確認のみ)</p> <p>Sample.fxml</p> <pre><code><?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?> <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" text="検索" /> <!-- 一覧 --> <TableView fx:id="tvCat" layoutX="14.0" layoutY="63.0" prefHeight="273.0" prefWidth="498.0"> <columns> <TableColumn maxWidth="50.0" minWidth="50.0" prefWidth="50.0" resizable="false" text="No" /> <TableColumn maxWidth="100.0" minWidth="100.0" prefWidth="100.0" text="名前" /> <TableColumn maxWidth="40.0" minWidth="40.0" prefWidth="40.0" text="性別" /> <TableColumn maxWidth="40.0" minWidth="40.0" prefWidth="40.0" text="年齢" /> <TableColumn minWidth="120.0" prefWidth="120.0" text="種別" /> <TableColumn minWidth="145.0" prefWidth="147.0" text="好物" /> </columns> <columnResizePolicy> <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> </columnResizePolicy> </TableView> </children> </AnchorPane> </code></pre> <h2 id="コントローラクラスの実装"><a href="#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E5%AE%9F%E8%A3%85">コントローラクラスの実装</a></h2> <p>JavaFX では、<br /> 基本的に fxml (画面定義)と対応するコントローラー(クラス)を作成し、<br /> コントローラーにてイベントなどを処理するような構成となります。</p> <p>fxml に記述した</p> <pre><code> fx:controller="application.SampleController" </code></pre> <p>でコントローラを指定し、コントローラークラスには<br /> 画面に設置したコントロールをメンバーとして定義することが必要。</p> <p>こうすることで、<br /> コントローラークラスにて画面のコントロールを操作することが可能となります。</p> <p>SampleController.java</p> <pre><code>package application; import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.Label; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; public class SampleController implements Initializable{ /** パネル:メイン */ @FXML private AnchorPane mainPane; /** ラベル:名前 */ @FXML private Label lbName; /** テキストフィールド:名前 */ @FXML private TextField txName; /** ラベル:種別 */ @FXML private Label lbKind; /** コンボボックス:名前 */ @FXML private ComboBox<String> cbKind; /** ボタン:検索 */ @FXML private Button btSearch; /** テーブルビュー:一覧 */ @FXML private TableView<String> tvCat; /** * @return mainPane */ public AnchorPane getMainPane() { return mainPane; } /** * @param mainPane セットする mainPane */ public void setMainPane(AnchorPane mainPane) { this.mainPane = mainPane; } /** * @return lbName */ public Label getLbName() { return lbName; } /** * @param lbName セットする lbName */ public void setLbName(Label lbName) { this.lbName = lbName; } /** * @return txName */ public TextField getTxName() { return txName; } /** * @param txName セットする txName */ public void setTxName(TextField txName) { this.txName = txName; } /** * @return lbKind */ public Label getLbKind() { return lbKind; } /** * @param lbKind セットする lbKind */ public void setLbKind(Label lbKind) { this.lbKind = lbKind; } /** * @return cbKind */ public ComboBox<String> getCbKind() { return cbKind; } /** * @param cbKind セットする cbKind */ public void setCbKind(ComboBox<String> cbKind) { this.cbKind = cbKind; } /** * @return btSearch */ public Button getBtSearch() { return btSearch; } /** * @param btSearch セットする btSearch */ public void setBtSearch(Button btSearch) { this.btSearch = btSearch; } /** * @return tvCat */ public TableView<String> getTvCat() { return tvCat; } /** * @param tvCat セットする tvCat */ public void setTvCat(TableView<String> tvCat) { this.tvCat = tvCat; } /* * (非 Javadoc) * @see javafx.fxml.Initializable#initialize(java.net.URL, java.util.ResourceBundle) */ @Override public void initialize(URL location, ResourceBundle resources) { // コンボボックスに項目を追加 cbKind.getItems().add("指定なし"); cbKind.getItems().add("キジトラ"); cbKind.getItems().add("長毛種(不明)"); cbKind.getItems().add("ミケ(っぽい)"); cbKind.getItems().add("サビ"); cbKind.getItems().add("その他"); // 初期選択状態を設定 cbKind.getSelectionModel().select(0); } } </code></pre> <p> </p> <h2 id="メインクラスの修正"><a href="#%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BF%AE%E6%AD%A3">メインクラスの修正</a></h2> <p>ちょっと嵌ったんですが<br /> fxml で AnchorPane のサイズをいくら変更しても<br /> いざ起動してみるとその通りのサイズになってくれませんでした。</p> <p>よくよく見なおしてみると、メインクラスにて、<br /> Scene のインスタンスを初期化する際に、幅と高さを指定していたことが原因でした。<br /> (デフォルトでそうなっている)</p> <p>幅と高さの指定を取り除いたら問題なく fxml で指定したサイズで表示されるようになりました。</p> <p>Main.java</p> <pre><code>package application; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) { try { AnchorPane root = (AnchorPane) FXMLLoader.load(getClass().getResource("Sample.fxml")); // 幅と高さを指定してインスタンスを生成 //Scene scene = new Scene(root, 400, 400); // 幅と高さを指定せずにインスタンスを生成 Scene scene = new Scene(root); scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage.setScene(scene); primaryStage.show(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); } } </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxCombo002.jpg" alt="コンボボックスに項目が設定された画面" /></p> <p>とりあえずコンボボックスへ項目を設定することができました。</p> <p>次回は、データベースから取得したデータを設定してみたいと思います。</p> <p>ではでは。</p> <p> </p> doraxdora tag:crieit.net,2005:PublicArticle/15681 2020-01-14T09:57:33+09:00 2020-01-14T10:00:51+09:00 https://crieit.net/posts/JavaFX-eclipse-JavaFX-Hello-World 【JavaFX】eclipseにJavaFXプラグインをインストールして Hello World してみる <p>どうも Swing が廃止される方向のようなので、<br /> 方向転換して Java FX をやってみたいと思います。</p> <p>まずは開発環境の構築から。</p> <h2 id="e(fx)clipseのインストール"><a href="#e%28fx%29clipse%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">e(fx)clipseのインストール</a></h2> <p>JavaFX 用の eclipse プラグインをインストールします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello000.jpg" alt="新規ソフトウェアのインストール" /></p> <p>上部メニューの「ヘルプ」>「新規ソフトウェアのインストール」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello001.jpg" alt="インストール画面" /></p> <p>インストール画面が表示されるので、「追加」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello002.jpg" alt="リポジトリ-の追加" /></p> <p>名前、ロケーションにそれぞれ下記を入力します。</p> <pre><code>名前: e(fx)clipse ロケーション: [http://download.eclipse.org/efxclipse/updates-released/2.4.0/site](http://download.eclipse.org/efxclipse/updates-released/2.4.0/site) </code></pre> <p> </p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello003.jpg" alt="インストールモジュールの選択" /></p> <p>インストール画面にて、追加したロケーションを選択し<br /> e(fx)clipse - IDE を選択して「次へ」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello004.jpg" alt="インストール詳細画面" /></p> <p>インストール詳細画面が表示されるので「次へ」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello005.jpg" alt="同意画面" /></p> <p>ライセンス画面が表示されるので、<br /> 使用条件の条項に同意して「完了」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello006.jpg" alt="再起動確認画面" /></p> <p>再起動確認画面が表示されます。<br /> ソフトウェア更新のため再起動が必要となりますので、「はい」ボタンをクリックして eclipse を再起動します。</p> <h2 id="Scene Builder のインストール"><a href="#Scene+Builder+%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Scene Builder のインストール</a></h2> <h3 id="ダウンロード"><a href="#%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89">ダウンロード</a></h3> <p>次のURLにアクセスします。<br /> <a target="_blank" rel="nofollow noopener" href="http://gluonhq.com/products/scene-builder/#download" target="_blank" rel="noopener noreferrer">http://gluonhq.com/products/scene-builder/#download</a></p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello007.jpg" alt="ダウンロードページ" /></p> <p>今回は、 Windows 64bit のインストーラーをダウンロードします。</p> <h3 id="インストール"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">インストール</a></h3> <p>ダウンロードした「SceneBuilder-8.3.0.exe」を実行します。</p> <p> </p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello008.jpg" alt="セキュリティの警告" /></p> <p>セキュリティの警告が表示される場合は「実行」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello009.jpg" alt="ライセンス同意画面" /></p> <p>ライセンス画面が表示されるので、同意して「Next」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello010.jpg" alt="インストール先指定画面" /></p> <p>インストール先指定画面が表示されるので、<br /> デフォルトのまま「Next」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello011.jpg" alt="Scene Builder" /></p> <p>SceneBuilder の画面が起動しました。</p> <h2 id="JavaFXの設定"><a href="#JavaFX%E3%81%AE%E8%A8%AD%E5%AE%9A">JavaFXの設定</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello012.jpg" alt="設定画面の表示" /></p> <p>上部メニューの「ウィンドウ」>「設定」を開きます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello013.jpg" alt="Scene Builder のパスを設定" /></p> <p>サイドメニューの「JavaFX」を選択し、<br /> SceneBuilderの実行ファイルまでのパスを設定、「OK」ボタンをクリックします。</p> <p>デフォルトであれば</p> <blockquote>C:\Users\[ユーザ名]\AppData\Local\SceneBuilder\SceneBuilder.exe</blockquote> <p>となります。</p> <h2 id="JavaFX プロジェクトの作成"><a href="#JavaFX+%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90">JavaFX プロジェクトの作成</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello014.jpg" alt="" /></p> <p>パッケージ・エクスプローラー上で右クリックし、「新規」>「その他」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello015.jpg" alt="プロジェクト作成" /></p> <p>「JavaFX」>「JavaFX Project」を選択し「次へ」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello016.jpg" alt="プロジェクト名の入力" /></p> <p>プロジェクト名を入力し「次へ」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello017.jpg" alt="ビルド設定画面" /></p> <p>Java設定画面が表示されるので「次へ」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello018.jpg" alt="言語設定" /></p> <p>プロジェクト設定画面が表示されるので、言語に「FXML」を選択し、「完了」ボタンをクリックします。</p> <h3 id="Hello World を表示してみる"><a href="#Hello+World+%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">Hello World を表示してみる</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello019.jpg" alt="Scene Builder で開く" /></p> <p>作成したプロジェクト>「src」>「application」>「Sample.fxml」を右クリックし<br /> 「Open with SceneBuilder」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello020.jpg" alt="Scene Builder 起動" /></p> <p>Sample.fxml ファイルが SceneBuilder で開かれます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello021.jpg" alt="ラベルの配置" /></p> <p>左側メニューの「Control」より、ラベルを選択して画面中央に配置し、<br /> 表示名を「Hello World!」に変更します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello022.jpg" alt="保存" /></p> <p>上部メニューの「File」>「Save」を選択して変更を保存して SceneBuilder を終了します。</p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p>プロジェクトを右クリックし「実行」>「Java アプリケーション」を選択します。</p> <p> </p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello024.jpg" alt="起動した画面" /></p> <p>無事に表示されました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ひとまず今回はここまで。</p> <p>次回からまた色々やっていきたいと思います。</p> <p>ではでは。</p> doraxdora