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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

7903閲覧

JAVAFXのTableViewにボタンを表示させる方法

shibayun

総合スコア12

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クリップ

投稿2018/01/27 04:13

こんにちは。現在DBのデータをTableViewに表示させ、そのデータ各項目の詳細画面へと遷移するためのボタンを配置したいと思っています。
DBからデータを取得しTableViewに表示させることはできましたが、セルを編集しボタンを実装する方法が分からず頭をかかえております。

http://krr.blog.shinobi.jp/javafx/javafx%20%E3%82%BB%E3%83%AB%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA
こちらのサイトを見るとコンボボックスやテキストフィールドなどは実装可能なようですが...
実装可能な方法がありましたらどうかご教授願います。

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

TableCell自体を自作するのはどうでしょうか?

ボタンを表示するためのクラス

java

1import java.util.function.Consumer; 2 3import javafx.scene.control.Button; 4import javafx.scene.control.TableCell; 5import javafx.scene.control.TableColumn; 6import javafx.util.Callback; 7 8public class ButtonCellFactory<E> implements Callback<TableColumn<E, ?>, TableCell<E, ?>> { 9 10 private String label; 11 private Consumer<E> onClick; 12 13 /** 14 * @param label ボタンに表示するテキスト 15 * @param onClick ボタンがクリックされたときに呼び出される 16 */ 17 public ButtonCellFactory(String label, Consumer<E> onClick) { 18 this.label = label; 19 this.onClick = onClick; 20 } 21 22 @Override 23 public TableCell<E, ?> call(TableColumn<E, ?> param) { 24 return new TableCell<E, Object>() { 25 @Override 26 public void updateItem(Object item, boolean empty) { 27 super.updateItem(item, empty); 28 if (empty) { 29 setGraphic(null); 30 setText(null); 31 } else { 32 Button btn = new Button(label); 33 btn.setOnAction(event -> { 34 E value = getTableView().getItems().get(getIndex()); 35 onClick.accept(value); 36 }); 37 setGraphic(btn); 38 setText(null); 39 } 40 } 41 }; 42 } 43}

使用例兼デモ

ウィンドウ左側の表のボタンを押すと、右側のテキスト領域に
クリックした行のデータを表示します。

java

1import javafx.application.Application; 2import javafx.beans.property.SimpleStringProperty; 3import javafx.collections.FXCollections; 4import javafx.scene.Scene; 5import javafx.scene.control.TableColumn; 6import javafx.scene.control.TableView; 7import javafx.scene.control.TextArea; 8import javafx.scene.control.cell.PropertyValueFactory; 9import javafx.scene.layout.BorderPane; 10import javafx.stage.Stage; 11 12public class ButtonTableAp extends Application { 13 TextArea console; 14 15 public static void main(String[] args) { 16 launch(args); 17 } 18 19 @Override 20 public void start(Stage stage) { 21 stage.setWidth(400); 22 stage.setHeight(300); 23 24 // 表の作成 25 TableView<Entity> table = new TableView<>(); 26 table.setItems(FXCollections.observableArrayList( 27 new Entity("名前1", "詳細1"), 28 new Entity("名前2", "詳細2"), 29 new Entity("名前3", "詳細3"), 30 new Entity("名前4", "詳細4"))); 31 32 // 1列名: 名前 33 TableColumn firstNameCol = new TableColumn("名前"); 34 firstNameCol.setCellValueFactory(new PropertyValueFactory<>("name")); 35 table.getColumns().addAll(firstNameCol); 36 37 // 2列名: ボタン 38 TableColumn actionCol = new TableColumn("詳細"); 39 actionCol.setCellValueFactory(new PropertyValueFactory<>("DUMMY")); 40 actionCol.setCellFactory(new ButtonCellFactory<Entity>("ボタン", e -> onTableButtonClick(e))); 41 table.getColumns().addAll(actionCol); 42 43 44 // レイアウト 45 console = new TextArea(); 46 BorderPane pane = new BorderPane(); 47 pane.setLeft(table); 48 pane.setCenter(console); 49 50 Scene scene = new Scene(pane); 51 stage.setScene(scene); 52 stage.show(); 53 } 54 55 /** 表のボタン押下時の処理 */ 56 private void onTableButtonClick(Entity selected) { 57 console.setText("名前:\r\n\t" + selected.getName() + "\r\n" + "詳細:\r\n\t" + selected.getDetails()); 58 } 59 60 /** 表の行のデータ */ 61 public static class Entity { 62 private final SimpleStringProperty name; 63 private final SimpleStringProperty details; 64 65 private Entity(String name, String details) { 66 this.name = new SimpleStringProperty(name); 67 this.details = new SimpleStringProperty(details); 68 } 69 70 public String getName() { 71 return name.get(); 72 } 73 74 public void setName(String nm) { 75 name.set(nm); 76 } 77 78 public String getDetails() { 79 return details.get(); 80 } 81 82 public void setDetails(String dt) { 83 details.set(dt); 84 } 85 86 } 87}

イメージ説明


コメントへの追記 @ 1/29

私が試した環境(JRE 1.8.0_151および、JDK 9.0.4)だけかもしれませんが、
表のデータ数(行数)に合わせて、ボタンは自動で追加・削除されます。

上記のサンプルでは、表のデータを4件(26行目で設定)としていますが、
後から、データを追加したり、削除しても問題ありませんでした(全件入れ直しも同様)。
表データを追加・削除するサンプルを記載しましたので、あわせてご確認ください。

java

1import javafx.application.Application; 2import javafx.beans.property.SimpleStringProperty; 3import javafx.collections.FXCollections; 4import javafx.collections.ObservableList; 5import javafx.scene.Scene; 6import javafx.scene.control.Button; 7import javafx.scene.control.TableColumn; 8import javafx.scene.control.TableView; 9import javafx.scene.control.TextArea; 10import javafx.scene.control.cell.PropertyValueFactory; 11import javafx.scene.layout.BorderPane; 12import javafx.scene.layout.HBox; 13import javafx.stage.Stage; 14 15public class ButtonTableAp2 extends Application { 16 private ObservableList<Entity> tableData; 17 private TextArea console; 18 19 public static void main(String[] args) { 20 launch(args); 21 } 22 23 @Override 24 public void start(Stage stage) { 25 stage.setWidth(400); 26 stage.setHeight(300); 27 28 // 表の作成 29 TableView<Entity> table = new TableView<>(); 30 table.setItems(tableData=FXCollections.observableArrayList( 31 new Entity("名前1", "詳細1"), 32 new Entity("名前2", "詳細2"), 33 new Entity("名前3", "詳細3"), 34 new Entity("名前4", "詳細4"))); 35 36 // 1列名: 名前 37 TableColumn firstNameCol = new TableColumn("名前"); 38 firstNameCol.setCellValueFactory(new PropertyValueFactory<>("name")); 39 table.getColumns().addAll(firstNameCol); 40 41 // 2列名: ボタン 42 TableColumn actionCol = new TableColumn("詳細"); 43 //actionCol.setCellValueFactory(new PropertyValueFactory<>("DUMMY")); 設定しなくても動く 44 actionCol.setCellFactory(new ButtonCellFactory<Entity>("ボタン", e -> onTableButtonClick(e))); 45 table.getColumns().addAll(actionCol); 46 47 // 表データを変更するためのボタン 48 Button addBtn =new Button("表データ追加"); 49 Button removeBtn =new Button("表データ削除"); 50 addBtn.setOnAction(event -> addToTable()); 51 removeBtn.setOnAction(event -> removeFromTable()); 52 53 HBox box=new HBox(); 54 box.getChildren().addAll(addBtn, removeBtn); 55 56 57 // レイアウト 58 console = new TextArea(); 59 BorderPane pane = new BorderPane(); 60 pane.setTop(box); 61 pane.setLeft(table); 62 pane.setCenter(console); 63 64 Scene scene = new Scene(pane); 65 stage.setScene(scene); 66 stage.show(); 67 } 68 69 private void addToTable(){ 70 int index=tableData.size()+1; 71 tableData.add(new Entity("追加名:"+index, "ボタンで追加されたデータです@"+index)); 72 } 73 74 private void removeFromTable(){ 75 if(tableData.size()>0){ 76 tableData.remove(tableData.size()-1); 77 } 78 } 79 80 /** 表のボタン押下時の処理 */ 81 private void onTableButtonClick(Entity selected) { 82 console.setText("名前:\r\n\t" + selected.getName() + "\r\n" + "詳細:\r\n\t" + selected.getDetails()); 83 } 84 85 /** 表の行のデータ */ 86 public static class Entity { 87 private final SimpleStringProperty name; 88 private final SimpleStringProperty details; 89 90 private Entity(String name, String details) { 91 this.name = new SimpleStringProperty(name); 92 this.details = new SimpleStringProperty(details); 93 } 94 95 public String getName() { 96 return name.get(); 97 } 98 99 public void setName(String nm) { 100 name.set(nm); 101 } 102 103 public String getDetails() { 104 return details.get(); 105 } 106 107 public void setDetails(String dt) { 108 details.set(dt); 109 } 110 } 111}

追加前
追加後

投稿2018/01/27 16:14

編集2018/01/29 10:31
whistyun

総合スコア149

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

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

shibayun

2018/01/29 05:55 編集

素晴らしい回答ありがとうございます。この場合、ボタンは宣言した数しか表示されないのでしょうか。 表示されるデータ行数に対応してボタンを表示させたいのですが、どうでしょうか...。
whistyun

2018/01/28 23:28 編集

TableCellから、行データ全体にアクセスするのは難しそうです。 ただし、行の一項目の情報は取得できるため、列数を表データの一項目に含めことで対応できます。 (手順) ・Entityクラスに一項目(列数とか)を追加する ・ButtonCellFactoryでワイルドカード("?"となっている箇所)を上項目で追加した列数の型に合わせる ・ButtonCellFactoryのupdateItemメソッドの第一引数も列数の型に合わせ、  第一引数の値に応じて、ボタンの表示数を切り替える。 ・ButtonTableAp の39行目付近(テーブルの2列目の設定)   actionCol.setCellValueFactory(new PropertyValueFactory<>("DUMMY"));  について、Entityに追加したプロパティ名に合わせる 取り急ぎ、対応方法だけ、、、
shibayun

2018/01/29 05:56

申し訳ありません、データ「行」数です(T-T)
shibayun

2018/01/29 05:58

つまり10件のデータを取得し表示した場合、10件のボタンを画像のように配置したいということです... 説明が下手ですみません。
whistyun

2018/01/31 10:57

すいません。コメントへの追記を忘れていました。 掲示したサンプルでは、テーブルの行数を4件固定としていましいますが、 ボタンの表示は、テーブルの行数に合わせて自動的に追加・削除されます。 ただし、ボタン押下時のイベントは、共通で1つのメソッド(データ行数が不明なため)となるため、 押された行のデータを受け取るメソッド(サンプルでは、onTableButtonClick)を用意し、 そのメソッド内で、行データから行うべき処理(質問者様の場合ですと、 どの詳細画面を開くか)を判断する必要があります。 ※ 回答にテーブル行数を後から追加・削除した場合の例を追記しています。ご確認ください。
shibayun

2018/02/05 01:19

ありがとうございます。試してみますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問