- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试遵循此 JavaFX 2 指南:
http://docs.oracle.com/javafx/2/ui_controls/table-view.htm#CJAGAAEE
我使用 Scala 而不是 Java,它对我来说是这样的:
<TableView fx:id="test">
<columns>
<TableColumn prefWidth="75.0" text="Message" />
</columns>
</TableView>
和代码:
val c = test.getColumns.get(0) // Get the first column.
c.setCellValueFactory(new PropertyValueFactory[Foo, _]("message")) // Foo is my model with a single SimpleStringProperty called "message".
val observableFoos = FXCollections.observableList(foos)
test.setItems(observableFoos)
我遇到的问题是 setCellValueFactory
行导致:
error: class type required but javafx.scene.control.cell.PropertyValueFactory[com.myapp.models.Foo, _] found c.setCellValueFactory(new PropertyValueFactoryFoo, _)
我不明白我应该如何使用这个方法。如果我用 String
替换 _
,那么我得到:
error: type mismatch; found : javafx.scene.control.cell.PropertyValueFactory[com.myapp.models.Foo,String] required: javafx.util.Callback[javafx.scene.control.TableColumn.CellDataFeatures[com.myapp.models.Foo,?0],javafx.beans.value.ObservableValue[?0]] where type ?0 c.setCellValueFactory(new PropertyValueFactoryFoo, String)
如果我删除 setCellValueFactory
行,我可以确认一切正常——我只是在表格中看不到任何内容——只是预期的空白行..
最佳答案
TL;DR:在 java 中很容易悄悄地绕过与类型参数有关的类型安全。Scala 不允许您这样做,除非执行显式转换。此外,使用 Table.getColumns
检索列意味着我们丢失了单元格的类型。解决方案:投你的TableColumn
实例化为正确的类型,或手动实例化该列。
第一个问题出在Table.getColumns
的签名上: 它返回 ObservableList[TableColumn[S,_]]
(参见 http://docs.oracle.com/javafx/2/api/javafx/scene/control/TableView.html#getColumns ())。所以你的 c
val 的类型为 TableColumn[Foo,_]
.这意味着您丢失了单元格内容的类型(由第二个类型参数表示)。
此处唯一的解决方案是使用强制转换正确键入列 ( c
):
val c = test.getColumns.get(0).asInstanceOf[TableColumn[Foo, String]]
c.setCellValueFactory(new PropertyValueFactory[Foo, String]("message"))
这是非常合乎逻辑的:您有一个列列表,其中每一列都可以包含不同类型的对象。对于包含不同类型对象的 Scala List,我们会面临同样的困境,所有对象都是先验未知的:只有强制转换(或类型匹配,这是伪装的强制转换)才能让您在编译时返回特定类型时间。
另请注意,在网络上的许多 JavaFx 示例中,人们不会通过 Table.getColumns
检索列.相反,他们手动实例化它们,然后调用 setCellValueFactory
之后就可以了。这样做可以解决您的问题(无需强制转换),因为您将自己指定类型参数:
val c = new TableColumn[Foo, String] // See ma, no cast!
c.setCellValueFactory(new PropertyValueFactory[Foo, String]("message"))
现在,您可能会看到一些 java 示例并注意到它们在实例化 TableColumn
时实际上并未提供任何 类型参数。 :
TableColumn c = new TableColumn();
c.setCellValueFactory( new PropertyValueFactory<Foo,String>("name"));
而且确实可以编译。为何如此?好吧,可悲的事实是,上面的代码并不比进行强制转换更安全,因为它依赖于 java 对前泛型感知类的向后兼容性。换句话说,因为 c
被键入为 TableColumn
而不是 TableColumn<?, String>
例如,Java 编译器将其视为非泛型类,并且不对 TableColumn
的类型参数执行任何类型检查。 .将此与显式设置 c
的类型时发生的情况进行对比到通用类型(但具有未知的单元格类型):
TableColumn<Foo, ?> name = new TableColumn("Name");
name.setCellValueFactory( new PropertyValueFactory<Room,String>("name"));
在这种情况下,编译器会发出类型不匹配错误:
error: method setCellValueFactory in class TableColumn<S,T> cannot be applied to given types;
...
这就像在 Scala 中一样 c
类型为 TableColumn[Foo, _]
关于Scala 中的 JavaFX 2 和 setCellValueFactory()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12771556/
我知道,这个问题已经被问过数百次了,我花了 3 个小时阅读了所有这些问题。我正在使用 JavaFX 编写一个小应用程序(我之前已经这样做过......)。除了将内容放入我的专栏之外,一切正常: @FX
我已经定义了表: @FXML private TableView tv_loro_nostro_accounts; private TableColumn tc_acc_nam
我正在尝试执行以下操作: tableColumns[0].setCellValueFactory( new PropertyValueFactory("username")
我已经检查了至少 20 个与该主题相关的其他线程,并尝试尽我所能进行调试,但我不知道为什么它不起作用。我希望我的“addButton”在按下按钮时将数据从文本框添加到我的 TableView 中。 我
我有一个填充对象列表的表,在其中一个列中我有一个comboBoxColumn。虽然 combobox 列不是 object 类的一部分,但我只是希望它在列中显示一个 String 。 我该怎么做?无需
在与 Netbeans 和 Scenebuilder 混了一段时间之后,我遇到了一个我不太明白的问题。我使用自定义 cellfactory将双击事件绑定(bind)到我的表格 View 中的单元格。但
我们如何使用 setCellValueFactory 和 setCellFactory? 它们之间有什么区别? 最佳答案 根据文档: setCellValueFactory 需要设置单元格值工厂以指定
我有一个自定义类 BasicDataSet其中包含 HashMap需要渲染(和可更新)到 JavaFX TableView 。一个BasicDataSet对象表示一行,该列缺少的任何 HashMap
我有一个带有自定义单元格渲染的表列,此单元格渲染采用一个对象并将其属性渲染为标签。问题是我找不到将数组列表中的相同对象传递到列的方法。这是我的代码: //I want to render this
我正在尝试遵循此 JavaFX 2 指南: http://docs.oracle.com/javafx/2/ui_controls/table-view.htm#CJAGAAEE 我使用 Scala
今天,我在尝试了解有关 JavaFX 和 Java 的更多信息时遇到了另一件我不太了解的事情。 引用以下教程(我试图将原理应用于组织者): JavaFX 8 Tutorial 我将简要概述我有问题的特
我有以下代码行在 JavaFX 中设置列: branchActionColumn.setCellValueFactory(cd -> cd.getValue().getAction().getTe
来自 eclipse 帮助: setCellValueFactory 需要将单元格值工厂设置为指定如何填充单个 TableColumn 中的所有单元格。单元值工厂是一个提供 CellDataFeatu
所以我遇到的主要问题是尝试设置 columnUUID.setCellValueFactory( new PropertyValueFactory("different") ); 时它不会填充 colu
我是一名优秀的程序员,十分优秀!