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

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

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

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

Q&A

解決済

2回答

7023閲覧

TableViewのCheckBox列を変更したときのイベント

XCUBE

総合スコア101

JavaFX

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

0グッド

1クリップ

投稿2016/09/06 06:39

編集2016/09/06 06:40

###前提・実現したいこと
TableViewの列をCheckBoxにしてCheckBoxの値が変わったらデータベースを更新したいのですが、
CheckBoxの値が変わったことを知らせるイベントが発生しません。
CheckBoxのON/OFFは見かけ上できているのですが、CheckBoxのイベントハンドラには
何も飛んでこないので、データベースの更新まで辿り着けません。

ネットで見つけたサンプルを見よう見まねで実装したので何か抜けがあるのかもしれませんが、
どのような原因が考えられるでしょうか?

###該当のソースコード

XML

1 <TableView fx:id="CheckTable" editable="true" layoutX="24.0" layoutY="60.0" prefHeight="908.0" prefWidth="392.0"> 2 <columns> 3 <TableColumn minWidth="-Infinity" prefWidth="46.0" resizable="false" text="適用" /> 4 <TableColumn editable="false" minWidth="77.0" prefWidth="144.0" text="名称" /> 5 </columns> 6</TableView>

Java

1 2 @FXML 3 private TableView<CheckName> CheckTable; 4 5 @Override 6 public void initialize(URL url, ResourceBundle rb) { 7 ObservableList<TableColumn<CheckName, ?>> cols = this.CheckTable.getColumns(); 8 cols.get(0).setCellValueFactory(new PropertyValueFactory<>("check")); 9 cols.get(1).setCellValueFactory(new PropertyValueFactory<>("name")); 10 11 ObservableList<CheckName> data = FXCollections.observableArrayList(); 12 this.CheckTable.setItems(data); 13 14 ((TableColumn<CheckName, Boolean>)cols.get(0)).setCellFactory(new Callback<TableColumn<CheckName, Boolean>, TableCell<CheckName, Boolean>>() { 15 public TableCell<CheckName, Boolean> call(TableColumn<CheckName, Boolean> p) { 16 CheckBoxTableCell cb = new CheckBoxTableCell<CheckName, Boolean>(); 17 18 cb.selectedProperty().addListener(new ChangeListener<Boolean>() { 19 @Override 20 public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 21 // ここまで辿り着かない 22 } 23 }); 24 return cb; 25 } 26 }); 27 28// 以降でObservableList<CheckName>にデータを入れる 29

Java

1public class CheckName { 2 private int No; // 関連番号 3 private BooleanProperty Check; 4 private StringProperty Name; 5 6 7 public ScheduleDataFacility() { 8 this.Check = new SimpleBooleanProperty(); 9 this.Name = new SimpleStringProperty(); 10 11 } 12 public ScheduleDataFacility(int no, boolean Schedule, String Name) { 13 this.No = no; 14 this.Check = new SimpleBooleanProperty(Schedule); 15 this.Name = new SimpleStringProperty(Name); 16 } 17 18 public int getNo() {return this.No;}; 19 public BooleanProperty checkProperty() { return Check; } 20 public StringProperty facilityProperty() { return Name; } 21 22 23 24 public void setNo(int no) {this.No = no;} 25 public void setCheck(Boolean Check) { this.Check.set(Check); } 26 public void setFacility(String Name) { this.Name.set(Name); } 27} 28コード

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問者さんがaddListener()で変化を監視しようとしているCheckBoxTableCell#selectedProperty()は基底クラスのCell#selectedProperty()から継承されたもので「そのセルが選択されているかどうか」という意味の物です。つまりCheckBoxTableCell上に表示されているCheckBoxの選択状態とは別物なので期待通り動かなかったのです。(ちなみにデフォルトのTableSelectionModelは選択対象が行でありセルは選択対象になりません。TableSelectionModel#setCellSelectionEnabled(true)とするとセルごとに選択状態にでき、その場合にのみこのプロパティの利用価値が生まれます。)

さて今のままのコードでも(kobanさんのコードと同じように)CheckBoxの状態がモデルのcheckプロパティーと連動しますのでCheckName#checkProperty()を監視すると期待通りのことが実現できます。同じ結果になるのでこのような典型的なパターンではkobanさんのコードの方が簡潔といえますね。

補足:名前の付け方(先頭一文字)
クラス・インターフェースは大文字、フィールド・パラメーター・ローカル変数は小文字とするのが習慣です。従わなくても文法違反ではありませんがこの習慣どおりとすることをお薦めします。理由は他の人が読みにくく感じるからです。例えばCheckTable.xxx()を見た瞬間多分多くのJavaプログラマーは「staticメソッドの起動」と直感すると思います。

投稿2016/09/28 10:32

編集2016/09/28 10:37
KSwordOfHaste

総合スコア18392

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

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

0

直接的な回答ではないですが私は以下のようにCheckBoxを実装しています。

cols.get(0)).setCellFactory(CheckBoxTableCell.forTableColumn(cols.get(0));

これにするとCheckNameクラスのCheckプロパティとテーブルのCHECKBOXが同期されると思います。
私もネット上のを参考にしてるだけなので意味はよくわかりません。

又、もしかして通常は変数の頭文字を小文字にするのでそこが原因かもしれません。
x Check ○ check

投稿2016/09/27 13:26

編集2016/09/27 13:32
koban

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問