2016-12-14 4 views
0

Я хотел бы, чтобы преобразовать следующий код, чтобы быть общих типов Java, чтобы избежать необходимости вручную повторно коду, при редактировании фиксации для каждого нового столбца таблицы ...JavaFX TableView - Generic OnEditCommit

colOccurrences.setOnEditCommit(
      new EventHandler<TableColumn.CellEditEvent<Damageloop, Float>>() { 
       @Override 
       public void handle(TableColumn.CellEditEvent<Damageloop, Float> t) { 
        ((Damageloop)t.getTableView().getItems().get(
          t.getTablePosition().getRow())).setOccurrences(t.getNewValue()); 
       } 
     }); 

У меня есть пытался добавить следующий код к классу заводского заказа клеток, который присваивается каждый столбец таблицы ...

TableColumn<S, T> col = super.getTableColumn(); 
col.setOnEditCommit(
new EventHandler<CellEditEvent<S, T>>() { 
    @Override 
    public void handle(CellEditEvent<S, T> t) { 
     TableColumn<S, T> col = t.getTableColumn(); 
     int row = t.getTablePosition().getRow(); 
     ObservableValue<T> ov = col.getCellObservableValue(row); 
     if (ov instanceof WritableValue) { 
      ((WritableValue<T>)ov).setValue(t.getNewValue()); 
     } 
    } 
}); 

И это успешно устанавливает основное наблюдаемое значение редактируемой ячейки. Однако, когда я звоню ...

TableView.getSelectionModel().getSelectedItem() 

В следующем разделе кода сохраняется прежнее неотредактированное значение. Однако, если я обновлю мой родовое на редактирование обязательство включать в себя следующее ...

TableColumn<S, T> col = super.getTableColumn(); 
col.setOnEditCommit(
new EventHandler<CellEditEvent<S, T>>() { 
    @Override 
    public void handle(CellEditEvent<S, T> t) { 
     TableColumn<S, T> col = t.getTableColumn(); 
     int row = t.getTablePosition().getRow(); 
     ObservableValue<T> ov = col.getCellObservableValue(row); 
     if (ov instanceof WritableValue) { 
      ((WritableValue<T>)ov).setValue(t.getNewValue()); 
     } 
     //NEW ADDITION TO EVENT HANDLER 
     Date date; 
     date = (Date) t.getNewValue(); 
     ((Damageloop) t.getTableView().getItems().get(t.getTablePosition().getRow())).setDamageloopworkshopduedate(date); 
    } 
}); 

TableView.getSelectionModel(). GetSelectedItem код() будет возвращать правильное обновленное значение.

Может ли кто-нибудь сказать мне, почему неизменяемое значение не обновляет список поддержки? или более подходящим образом, как преобразовать новое дополнение в обработчик событий для использования дженериков?

+0

Пожалуйста, разместите одно из свойств, включая getter/setter/property getter, из класса 'Damageloop' и' cellValueFactory', где это свойство используется ... – fabian

+0

Обратите внимание, что весь ваш первый блок кода можно просто свести к 'colOccurrences .setOnEditCommit (t -> t.getRowValue(). setOccurrences (t.getNewValue())); ' –

ответ

1

Во-первых, несколько причин, по которым вам, вероятно, это не нужно.

  1. Если вы используете JavaFX properties pattern в своем классе модели, то есть, если вы

    public class Damageloop { 
    
        private ObjectProperty<Float> occurrences = new SimpleObjectProperty<>(0.0f); 
    
        public ObjectProperty<Float> occurrencesProperty() { 
         return occurrences ; 
        } 
    
        public final Float getOccurrences() { 
         return occurrencesProperty().get(); 
        } 
    
        public final void setOccurrences(Float occurrences) { 
         occurrencesProperty().set(occurrences); 
        } 
    
        // ... 
    } 
    

    затем стандартные редактируемые ячейки таблиц (таких как TextFieldTableCell) обновит свойство на редактирование фиксации по умолчанию: т.е. нет необходимости определять обработчик onEditCommit.

  2. Даже если вы не используете шаблон свойств, как указано выше, Java 8 лямбда-выражений и расширенный вывод типа уже позволяют сократить весь первый блок кода в одну строку заявление в:

    colOccurrences.setOnEditCommit(e -> e.getRowValue().setOccurrences(e.getNewValue())); 
    

Если вы действительно хотите создать это в многоразовой общем виде, вы можете сделать что-то вроде

public class TableUtils { 

    public static <S,T> void createDefaultEditHandler(
     TableColumn<S,T> column, BiConsumer<S,T> committer) { 

     column.setOnEditCommit(event -> 
      committer.accept(event.getRowValue(), event.getNewValue())); 

    } 
} 

который можно ссылаться с:

TableUtils.createDefaultEditHandler(colOccurrences, Damageloop::setOccurrences); 

(и это полностью повторное использование для столбцов других типов ...).

+0

Множество хороших решений для моей проблемы здесь. Спасибо за исчерпывающий ответ :). – Josh

+0

Почему 'setOnEditCommit'? https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TableView.html говорит: «Если вы не обработаете обратную запись свойства (или соответствующего источника данных), ничего не произойдет. " Какие меры предосторожности мы должны предпринять, чтобы убедиться, что это не наша судьба? –

+0

@ LimitedAtonement - это не то, что я здесь ответил?Если вы используете шаблон свойств JavaFX и не вызываете 'setOnEditCommit', значение по умолчанию' onEditCommit' будет обновлять свойство. –

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