2

内部にコンポーネントを含むテーブルビューを作成し、cellValueFactory を割り当て、プロパティeditableを に設定しましたtrue。私のコードのどこかに、次のものがあります。

    ...
    tableID.selectionModel().selectedItem.onChange(
          (_, _, newValue) => col_uname.setCellFactory(TextFieldTableCell.forTableColumn());
    ...

それを使用して、テキストフィールドに変換するために作成し、入力できるようにしました。ただし、入力が終了すると、テキストは編集前の前のテキストに戻りました。テキストが適切に更新されていることを確認するには、どのタイプ/コードを含める必要がありますか? Googleで検索してみましたが、今のところ説明がありません。

4

1 に答える 1

1

あなたが言及したようにeditable = true、テキストフィールドでセルファクトリを追加することで、テーブルを編集できるはずです。たとえば、次のようになります。

new TableColumn[Person, String] {
  text = "First Name"
  cellValueFactory = {_.value.firstName}
  cellFactory = TextFieldTableCell.forTableColumn()
  prefWidth = 180
}

JavaFX テーブル ビュー チュートリアルでも、の使用が推奨されてOnEditCommitいます。それが本当に必要かどうかはわかりません。を使用せずに動作する完全な例を次に示しますOnEditCommit

import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.beans.property.StringProperty
import scalafx.collections.ObservableBuffer
import scalafx.event.ActionEvent
import scalafx.scene.Scene
import scalafx.scene.control.TableColumn._
import scalafx.scene.control.cell.TextFieldTableCell
import scalafx.scene.control.{Button, TableColumn, TableView}
import scalafx.scene.layout.VBox

object EditableTableView extends JFXApp {

  class Person(firstName_ : String, lastName_ : String) {

    val firstName = new StringProperty(this, "firstName", firstName_)
    val lastName  = new StringProperty(this, "lastName", lastName_)

    firstName.onChange { (_, oldValue, newValue) => println(s"Value changed from `$oldValue` to `$newValue`") }
    lastName.onChange { (_, oldValue, newValue) => println(s"Value changed from `$oldValue` to `$newValue`") }
    override def toString = firstName() + " " + lastName()
  }

  val characters = ObservableBuffer[Person](
    new Person("Peggy", "Sue"),
    new Person("Rocky", "Raccoon")
  )

  stage = new PrimaryStage {
    title = "Editable Table View"
    scene = new Scene {
      root = new VBox {
        children = Seq(
          new TableView[Person](characters) {
            editable = true
            columns ++= List(
              new TableColumn[Person, String] {
                text = "First Name"
                cellValueFactory = {_.value.firstName}
                cellFactory = TextFieldTableCell.forTableColumn()
                prefWidth = 180
              },
              new TableColumn[Person, String]() {
                text = "Last Name"
                cellValueFactory = {_.value.lastName}
                cellFactory = TextFieldTableCell.forTableColumn()
                prefWidth = 180
              }
            )
          },
          new Button {
            text = "Print content"
            onAction = (ae: ActionEvent) => {
              println("Characters:")
              characters.foreach(println)
            }
          }
        )
      }
    }
  }
}
于 2015-11-19T01:41:25.357 に答える