作为一名 Swing 程序员,我不敢相信这这么难,但显然确实如此。
我有一个 javafx TableView,我想更改模型的一个值并正确更新屏幕。
出于多种原因,我不想使用 SimpleStringProperty 及其同类。一是我想使用 POJO。另一个是我的数据元素不是字符串!! (它们也不是像整数这样的简单数据类型)。所以使用这些是不可能的。
我也不想知道任何像隐藏和取消隐藏列之类的黑客行为以及任何类似的废话。我想知道正确的方法(™)来做到这一点,我会为其他人留下技巧。
在 Swing 中实现这一点的方法当然很简单。您将调用 model.fireTableRowsUpdated(index, index);
最佳答案
我感觉到你了。表格是应用程序中最常见的东西之一,而它在 JavaFX 中的实现方式是最令人尴尬的(当您更改单元格时丢失数据的焦点错误仍未解决)并且在现实环境中绝对无法使用。难怪他们称之为 TableVIEW,因为你几乎无法用它做任何不同的事情。
我尝试实现一个简单的复制/粘贴功能,将一个单元格的内容复制到另一个单元格。这并不容易。但是,我通过获取单元格的属性并调用 set 方法的方式解决了这个问题。
摘录:
if( observableValue instanceof DoubleProperty) {
try {
double value = numberFormatter.parse(clipboardCellContent).doubleValue();
((DoubleProperty) observableValue).set(value);
} catch (ParseException e) {
e.printStackTrace();
}
}
else if( observableValue instanceof IntegerProperty) {
try {
int value = NumberFormat.getInstance().parse(clipboardCellContent).intValue();
((IntegerProperty) observableValue).set(value);
} catch (ParseException e) {
e.printStackTrace();
}
}
else if( observableValue instanceof StringProperty) {
((StringProperty) observableValue).set(clipboardCellContent);
} else {
System.out.println("Unsupported observable value: " + observableValue);
}
您可以从 this gist 获取完整代码。它可能会让您了解如何解决此问题。
关于 POJO:您必须使用属性。对于其他类型,请使用适当的类型,DoubleProperty、ObjectProperty 等。
而且它是可观察的,一旦你改变了数据,tableview就会更新。
关于java - 如何更新 javafx TableView 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31065967/