当前位置: 首页 > 知识库问答 >
问题:

如何在ScalaFX中更新TableView?

淳于凯
2023-03-14

我有一张桌子的风景。当我更新一行的属性时,我看不到修改?例如:

implicit class PersonView(p:Person) {
  val fname = new ObjectProperty(this, "fname",p.name)
}

在我的表格视图中

lazy val tableLines = ObservableBuffer(persView)
val personTable = new TableView[PersonView](tableLines) {
  columns ++= List(
    new TableColumn[PersonView, String] {
      text = "Name"
      cellValueFactory = _.value.fname
      cellFactory = { _ =>
        new TableCell[PersonView, String] {
          item.onChange { (_, _, newValue) => text = newValue }
        }
      }
    }
  )
}

它工作得很好,但当我更新名称时,我不能在GUI中看到。

共有1个答案

曾元忠
2023-03-14

首先,我将尝试总结一下我所看到的,以及我认为你应该如何做到这一点:

PersonView类通过提供fname属性来修饰Person实例,该属性初始化为关联的Personname字段。在“name”列中创建每个单元格时,您将创建这样一个属性,并将其与单元格的值关联。从今以后,每当该属性的值发生更改时,单元格将自动更改其item字段,以显示该属性的新值。(顺便说一句,onchange属性是多余且不必要的--当item属性(即绑定的fname属性)发生更改时,它提供了执行其他操作的机会,因此单元格在执行时已经被更新。)

因此,如果现在更改Person实例的名称,那么“name”列中该Person的单元格会发生什么变化?没什么。

首先,正如@james_d指出的,您还没有在Person实例的名称与最初与之关联的ObjectProperty实例的值之间建立关系。也就是说,您所做的只是更改字符串值。对于要更新的GUI,ObjectProperty的值也需要更改。

另一个问题是,Person与其关联的PersonView之间没有关系。因此,当personname字段更改时,personto person无法通知其PersonView。更糟糕的是,通过使PersonView成为隐式类,您表明PersonView实例本身是不重要的和暂时的,它们只是为了用一组附加的方法和/或属性装饰一些Person实例而临时存在的。

那么,我们怎样才能改变事物,使它们如你所期望的那样工作呢?有两种基本方法,您的选择取决于可以对Person类施加多大的控制。这两种情况下的关键是确保每当人员名称更改时,包含人员名称的StringProperty(顺便说一句,这是比ObjectProperty更好的选项)都会更改...

首先,最简单的方法是完全取消PersonView类。显然,您需要能够编辑person来完成此操作;如果你不能,你将不得不尝试第二种方法。应修改Personhtml" target="_blank">添加fname属性字段,并将name转换为报告fname当前值的函数:

// initName is the initial name of the Person, and may be changed later...
class Person(initName: String, /*Whatever other arguments you require*/) {

  // String property storing this Person's name. Name is initialized to initName.
  val fname = new StringProperty(this, "fname", initName)

  // Report the current name of this Person.
  def name = fname.value

  // This function is not necessary, since we could change the value through fname directly
  // but it does look better...
  def name_=(newName: String): Unit = fname.value = newName
}

在本例中,表初始化如下所示:

val tableLines = ObservableBuffer(persView) // Of Person, not PersonView!
val personTable = new TableView[Person](tableLines) {
  columns ++= List(
    new TableColumn[Person, String] {
      text = "Name"
      cellValueFactory = _.value.fname
      // No need for a cellFactory - default works fine.
    }
  )
}

现在,您可以更改人员的名称,如下所示:

val someone = new Person("Bob"/*, etc...*/)
someone.name = "Fred"

在本例中,PersonView不能是隐式类。我们希望保留一个PersonView实例,并使用它与关联的Person实例交互。PersonView现在如下所示:

class PersonView(p: Person) {

  // String property initialized to the name of the associated person.
  val fname = new StringProperty(this, "fname", p.name)

  // Change the name of the person. Note that we MUST also change the name of the
  // associated person instance.
  def name_=(newName: String): Unit = {

    // Change the name of the Person instance. Verify it has the value we think it has.
    assert(p.name == fname.value)
    p.name = newName // Might be p.setName(newName), etc. in your case

    // Change the name of our property.
    fname.value = newName
  }
}

现在,假设您有一个Person实例列表,您需要将它们映射到PersonView实例,然后使用这些实例。

您的GUI代码现在如下所示:

val tableLines = ObservableBuffer(persView)
val personTable = new TableView[PersonView](tableLines) {
  columns ++= List(
    new TableColumn[PersonView, String] {
      text = "Name"
      cellValueFactory = _.value.fname
      // No need for a cellFactory - default works fine.
    }
  )
}
val someone = new Person("Bob"/*, etc...*/)
val someoneView = new PersonView(someone)
someoneView.name = "Fred"
someone.name = "Eric"

 类似资料:
  • 我想改变滚动条的背景颜色。这是我的代码的一部分,我尝试这样做: 文本显示正常,但两次尝试更改背景颜色都没有效果,使用: Scala version 2.10.3(JavaHotSpot(TM)64位服务器VM,Java1.8.0_05)。 检查与风景视图,我发现两个StackPanes意外地出现在场景图下面的ScrollPane,所以层次结构是: ScrollPane //我创建的 StackPa

  • 在更新到飘飘 2.8 之前 更新到飘飘 2.8 后: 如何更新minSdkVersion更高?我在任何地方都找不到目标“flutter.minSdkVersion”变量。

  • 问题内容: 似乎只是更新其中的软件包,但是。 现在您可以通过运行进行安装,但这不适用于 有任何想法吗? 问题答案: 除本地模块外,还要更新package.json,请运行 或者,使用同一命令来节省时间 您可以通过以下方式查看更新的全部详细信息或与此相关的任何命令

  • 我有一个旧的phpMyAdmin安装(包含我的培训和工作数据)。我想更新到最新版本,我想在更新时保护我的数据安全。有什么方法可以通过在终端上运行一些命令来实现吗?如果我卸载phpMyAdmin,我的数据会被删除吗?