2015-06-26 3 views
0

Как программист Swing, я не могу поверить, что это так сложно, но, по-видимому, это так.Как обновить значения табличного значения javafx

У меня есть табличный экран javafx, и я хочу изменить одно из значений модели и правильно обновить экран.

Я НЕ хочу использовать SimpleStringProperty и его аналогию по ряду причин. Один из них - я хочу использовать POJO. Другое дело, что мои элементы данных не являются строками! (они не являются простыми типами данных, такими как целые). Поэтому использование этих вопросов не может быть и речи.

Я также не хочу знать о каких-либо хаках, таких как скрытие и скрытие столбцов, и любая такая глупость. Я хочу знать правильный путь (™), чтобы сделать это, и я оставлю хаки для других.

Способ сделать это в Swing, конечно, тривиальным. Вы бы назвали model.fireTableRowsUpdated (индекс, индекс);

+4

Вы пробовали обновить значение в 'ObservableList ', которое вы установили в TableView? – ItachiUchiha

+1

Вы должны использовать наблюдаемые свойства; они не обязательно должны быть строками или обертками для примитивов, но вы можете использовать ['ObjectProperty'] (http://docs.oracle.com/javase/8/javafx/api/javafx/beans/property/ObjectProperty. html), например. Если у вас есть существующие объекты стиля JavaBean, вы можете использовать [адаптер] (http://docs.oracle.com/javase/8/javafx/api/javafx/beans/property/adapter/JavaBeanObjectProperty.html) (хотя Конечно, компонент, построенный с использованием свойств JavaFX, по-прежнему придерживается шаблона JavaBean). –

+0

ObservableList помогает только на уровне списка, а не на уровне отдельных объектов. – user2709454

ответ

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 и т. Д.

И можно наблюдать, как только вы измените данные, таблица будет обновляться.

+0

интересное усилие, возможно, в JavaFX 9 – mKorbel

+0

Если вы говорите, что это: Object observableValue = (Object) table.getColumns(). Get (col) .getCellObservableValue (строка); вернет редактируемую ячейку, тогда это может сработать. Мне кажется странным, что JavaFX отказался от идеи модели, но это может сделать трюк. – user2709454

Смежные вопросы