首页 文章

如何更新javafx TableView值

提问于
浏览
0

作为一名Swing程序员,我不敢相信这很难,但显然是这样 .

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

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

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

在Swing中实现它的方法当然是微不足道的 . 你可以调用model.fireTableRowsUpdated(index,index);

1 回答

  • 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将更新 .

相关问题