我有一张桌子的风景。当我更新一行的属性时,我看不到修改?例如:
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中看到。
首先,我将尝试总结一下我所看到的,以及我认为你应该如何做到这一点:
PersonView
类通过提供fname
属性来修饰Person
实例,该属性初始化为关联的Person
的name
字段。在“name”列中创建每个单元格时,您将创建这样一个属性,并将其与单元格的值关联。从今以后,每当该属性的值发生更改时,单元格将自动更改其item
字段,以显示该属性的新值。(顺便说一句,onchange
属性是多余且不必要的--当item
属性(即绑定的fname
属性)发生更改时,它提供了执行其他操作的机会,因此单元格在执行时已经被更新。)
因此,如果现在更改Person
实例的名称,那么“name”列中该Person
的单元格会发生什么变化?没什么。
首先,正如@james_d指出的,您还没有在Person
实例的名称
与最初与之关联的ObjectProperty
实例的值之间建立关系。也就是说,您所做的只是更改字符串
值。对于要更新的GUI,ObjectProperty
的值也需要更改。
另一个问题是,Person
与其关联的PersonView
之间没有关系。因此,当person
name
字段更改时,person
to person无法通知其PersonView
。更糟糕的是,通过使PersonView
成为隐式
类,您表明PersonView
实例本身是不重要的和暂时的,它们只是为了用一组附加的方法和/或属性装饰一些Person
实例而临时存在的。
那么,我们怎样才能改变事物,使它们如你所期望的那样工作呢?有两种基本方法,您的选择取决于可以对
Person
类施加多大的控制。这两种情况下的关键是确保每当人员
的名称
更改时,包含人员
名称的StringProperty
(顺便说一句,这是比ObjectProperty
更好的选项)都会更改...
首先,最简单的方法是完全取消
PersonView
类。显然,您需要能够编辑person
来完成此操作;如果你不能,你将不得不尝试第二种方法。应修改Person
以html" 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,我的数据会被删除吗?