如何更新javafx TableView值

时间:2015-06-26 06:00:39

标签: java swing javafx tableview

作为一名Swing程序员,我无法相信这很难,但显然确实如此。

我有一个javafx TableView,我想更改模型的其中一个值并正确更新屏幕。

出于多种原因,我不想使用SimpleStringProperty及其同类产品。一个是我想使用POJO。另一个是我的数据元素不是字符串!! (它们都不是像Integers这样的简单数据类型)。所以使用这些是不可能的。

我也不想知道隐藏和取消隐藏列等任何黑客行为以及任何类似的废话。我想知道正确的方法(™),我会为其他人留下黑客。

在Swing中这样做的方式当然是微不足道的。你可以调用model.fireTableRowsUpdated(index,index);

1 个答案:

答案 0 :(得分:1)

我感觉到你。表是应用程序中最常见的事情之一,它在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就会更新。