Life読んだ本や、プログラミング、システム開発等のねたを中心に。文章を書く練習なので少し硬派に書くつもりだけど、どうなることやら。この広告は、90日以上更新していないブログに表示しています。JavaFX前回はListViewについてだったので今回は予告どおりTableViewの基本的な使い方を簡単にまとめる。あと、CellValueFactory,CellFactory辺りも。TableView基本的な使い方(文字列のTableView)MWではInstalledMaterialListなどで使用しているが、このようなTableを作成する場合。TableViewにObservableListをsetItemして内部データ構造と画面上の行がをバインドする考え方は基本的にListViewと一緒なので基本的な構造としては以下のようになる。TableViewの場合には1行のデータに複数の列があるので、tableRecordにaddするデータは何らかの構造を持ったオブジェクト(この例だったらTableRecordのインスタンス)となる。SimpleStringProperty(tags);}}あとは、TableRecordのどの属性をどの列(TableColumn)の値に対応付けるかを、CellValueFactoryを使って関連付ける。PropertyValueFactoryで"materialID"を指定すると、TableRecord#materialIDProperty()が呼ばれる。PropertyValueFactory<TableRecord,String>("concatenatedTag"));TableRecord側では、上記のPropertyValueFactoryで文字列指定されたプロパティ名にPrpperty()を付け加えたメソッドを定義しておく。このメソッドを定義しとかないと、FX君はTableViewに表示する値を取得できない。内部的にこのようなメソッドを呼ぶようにした想いはあるんだろうけど、なんか出来の悪い黒魔術的アプローチだなぁ。出来のよい黒魔術ならもう少し直感的なんだろうけど(Java界隈では常識の範疇だったらゴメンナサイ)。concatenatedTag;}}編集可能なTableView(TextFieldTableCellの使用)TableViewの特定のセルを直接編集可能にしたいなんて要件もよくありがち。JavaFXでは、テーブルのセルを標準のセル実装(TableCell)から他のセル実装(この場合は編集可能なセル実装)に差し替えることで、実現できる。入力で編集するのであれば、組み込みの実装としてTextFieldTableCellが使用できる。上の例では、データ値の連携のためにCellValueFactoryを使用したが、今回はCellそのものを差し替えるために、CellFactoryを使用する。DefaultStringConverter());}});TableColumn#setCellFactory()で新たなCallbackを定義し、そのcallメソッドで使用するTableCell一味を返却する。ここでは、TextFieldTableCellインスタンスを返却するので、セルがTextFieldとなっているセルがmemoColでは使用されることになる。ProgressBarTableCell辺りはJavaFX2.2ならば組み込まれているので割りと簡単に使えそう。上記ではあくまでも表の特定のセルを、TextFieldTableCellに変更したのみであり、変更した内容は一切ObservableListの方にも反映されていない。セルの編集終了時の処理を実装するために、TableColumn#setOnEditCommit()を実装する。t.getTableView().getItems().get(t.getTablePosition().getRow())).setMemo(t.getNewValue());}});セルの編集時にはCellEditEventが投げられるのでそのイベントハンドラを実装する。Factoryのサンプルのまんまだけど)。TableRecord側でのsetMemo実装は以下のようなかたち。"+newValue);}TableViewを編集可能にする上記までで特定列を編集可能なTableCellで実装するようにしたが、TableViewそのものが編集可能になっていないと駄目らしい。ProgressBarTableCellなどは組み込みのTableCellサブクラスとして利用可能なのだが、特定の列に画像を表示する要件もよくありがち*1。先の例でTextFieldTableCell部分を、ImageViewを組み込んだ自作のTableCellにすれば実現できる。ImageColCell();}});ImageColCellの実装はこのようなイメージ。TableCellを継承したセルクラスを作成し、updateItemをオーバーライドすれば良さそう。TableCellクラスの中ではsetTextで表示する文字を設定し、setGraphicで任意のNodeを配置できるっぽい。{e.printStackTrace();}setText(null);setGraphic(imageView);}}}これらを組み込んだTableViewはこんなイメージになる。»プロフィールid:kazyury読んだ本や、プログラミング、システム開発等のねたが中心です。ここでは硬派にと思ってるけど、どうなるかなぁ。(1)はてなブログをはじめよう!kazyuryさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。