JavaFXのTableViewを使って、表を作りました。
いくつかTableColmunを追加して、そのうちの一つを編集可能セルとしました。
もくろみ通り、編集可能セルは編集可能になったのですが、わからないことがあります。
初期値として0を設定しているのですが、その0がセルに表示されません。
セルに文字列が表示されるのは、セルをダブルクリックして編集状態にし、何か値を入力して確定した後のみです。
確定後は入力した文字が表示されています。
外から(編集状態にしたテキストフィールドへの入力ではなく、プログラムのコードから)値を設定して表示させるには
どうしたらよいのでしょうか。
それと、何か値を入力して再び編集状態にすると、前に入力して確定していた文字列が消えてしまいます。
これも解決方法は同じではないかと思うのですがどうでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
画面上の表示データと内部でもつ変数は紐付けを行わないと相互に値が反映されません。
そのため初期値が反映されない、編集が反映されない、ということが起きていると思います。
TableViewにObservableListをsetItemすることで内部データと画面上の表示が紐付けされます。
またどの列がどのデータを表しているかを紐づけるために
TableColmunのsetCellValueFactory(Callback)を使います。
行モデル内にPropertyを定義しておくことで行データが変更されたときに
すぐに画面上に反映されるようになります。
以下は編集可能な1列とその他2列を持つテーブルで紐付けを行った場合の例です。
Java
1public class FXMLController implements Initializable { 2 3 @FXML private TableView<MyRow> tableView; 4 @FXML private TableColumn<MyRow,String> col1; 5 @FXML private TableColumn<MyRow,Integer> col2; 6 @FXML private TableColumn<MyRow,Boolean> col3; 7 8 @Override 9 public void initialize(URL url, ResourceBundle rb) { 10 tableView.setEditable(true); 11 col1.setCellValueFactory(new PropertyValueFactory<>("c1"));//行モデルと列のひもづけ 12 // col1を編集可能セルにします 13 col1.setCellFactory(cell-> new TextFieldTableCell<>(new DefaultStringConverter())); 14 col2.setCellValueFactory(new PropertyValueFactory<>("c2"));//行モデルと列のひもづけ 15 col3.setCellValueFactory(new PropertyValueFactory<>("c3"));//行モデルと列のひもづけ 16 // データの投入 17 ObservableList<MyRow> rows = FXCollections.observableArrayList(); 18 rows.add(new MyRow("foo", 0, false)); 19 rows.add(new MyRow("bar", 1, true)); 20 rows.add(new MyRow("hoge", 2, false)); 21 rows.add(new MyRow("fuga", 3, false)); 22 tableView.setItems(rows); 23 } 24 25 @FXML // この例では「変更」ボタンを用意して「変更」ボタンをクリックするとセルのデータが変わるように実装しています 26 private void changeRow(ActionEvent evt){ 27 tableView.getItems().stream() 28 .filter(row -> row.getC1().equals("bar")) 29 .findFirst() 30 .get() 31 .setC1("forbar"); 32 } 33 34 // 行モデルの定義 35 public class MyRow{ 36 // 紐付けを行うためにPropertyを行モデル内に用意します。 37 private final SimpleStringProperty c1; 38 private final SimpleIntegerProperty c2; 39 private final SimpleBooleanProperty c3; 40 41 public MyRow(String c1,int c2,boolean c3){ 42 this.c1 = new SimpleStringProperty(c1); 43 this.c2 = new SimpleIntegerProperty(c2); 44 this.c3 = new SimpleBooleanProperty(c3); 45 } 46 47 /* 48 setCellValueFactoryで指定した名前にPropertyをつけたメソッドを用意します。 49 これを用意しておくことで 50 このプロパティの変更に対して自動的に変更通知がされる仕組みが設けられます。 51 TableView側はプロパティの変更通知が伝達されてくると直ちに値を画面に反映します。 52 */ 53 public StringProperty c1Property(){return c1;} 54 public IntegerProperty c2Property(){return c2;} 55 public BooleanProperty c3Property(){return c3;} 56 57 public String getC1() {return c1.get();} 58 public int getC2() {return c2.get();} 59 public boolean isC3() {return c3.get();} 60 public void setC1(String c1) {this.c1.set(c1);} 61 public void setC2(int c2) {this.c2.set(c2);} 62 public void setC3(boolean c3) {this.c3.set(c3);} 63 } 64}
投稿2016/05/31 06:09
総合スコア48
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/31 11:01