2015-06-12 3 views
2

Я пытаюсь реализовать редактирование фиксации изменений фокуса отсюда http://docs.oracle.com/javafx/2/ui_controls/table-view.htm. И у меня есть следующее:JavaFX: обработчик TableView onEditCommit никогда не называется

class EditingCell extends TableCell<Object, String> { 

    private TextField textField; 

    public EditingCell() { 
    } 

    @Override 
    public void startEdit() { 
     System.out.println("START EDIT"); 
     if (!isEmpty()) { 
      super.startEdit(); 
      createTextField(); 
      setText(null); 
      setGraphic(textField); 
      textField.selectAll(); 
     } 
    } 

    @Override 
    public void cancelEdit() { 
     System.out.println("CANCEL EDIT"); 
     super.cancelEdit(); 
     setText((String) getItem()); 
     setGraphic(null); 
    } 

    @Override 
    public void updateItem(String item, boolean empty) { 
     super.updateItem(item, empty); 
     if (empty) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      if (isEditing()) { 
       if (textField != null) { 
        textField.setText(getString()); 
       } 
       setText(null); 
       setGraphic(textField); 
      } else { 
       setText(getString()); 
       setGraphic(null); 
      } 
     } 
    } 

    private void createTextField() { 
     textField = new TextField(getString()); 
     textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2); 
     textField.focusedProperty().addListener(new ChangeListener<Boolean>(){ 
      @Override 
      public void changed(ObservableValue<? extends Boolean> arg0, 
       Boolean arg1, Boolean arg2) { 
       System.out.println("Test1"); 
        if (!arg2) { 
         commitEdit(textField.getText()); 
        } 
      } 
     }); 
    } 

    private String getString() { 
     return getItem() == null ? "" : getItem().toString(); 
    } 
} 

У меня есть POJO DTO, и поэтому я использую propertybuilder. И здесь я использую этот код:

Callback<TableColumn, TableCell> cellFactory = 
    new Callback<TableColumn, TableCell>() { 
     public TableCell call(TableColumn p) { 
      return new EditingCell(); 
     } 
}; 
.... 
TableColumn textColumn = new TableColumn<>("Text"); 
textColumn.setEditable(true); 
textColumn.setCellFactory(cellFactory); 
textColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Answer,String>, ObservableValue<String>>() { 
    @Override 
    public ObservableValue<String> call(TableColumn.CellDataFeatures<Answer, String> item) { 
     try { 
      return new JavaBeanStringPropertyBuilder().bean(item.getValue()).name("text").build(); 
     } catch (NoSuchMethodException ex) { 
      Logger.getLogger(TaskDirItemController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return null; 
    } 
}); 
textColumn.setOnEditCommit(//THIS HANDLER IS NEVER CALLED 
    new EventHandler<CellEditEvent<Answer, String>>() { 
     @Override 
     public void handle(CellEditEvent<Answer, String> t) { 
      System.out.println("New Value:"+t.getNewValue()); 
      Answer answer=(Answer)t.getTableView().getItems().get(t.getTablePosition().getRow()); 
     } 
    } 
); 

В чем моя ошибка?

EDIT 1
я узнал, что обработчик вызывается только тогда, когда мы меняем фокус на любой другой компонент JavaFX КРОМЕ рядам в той же таблице. Как это исправить?

+0

@Uluk Biy Не могли бы вы взглянуть? –

+0

Это ошибка в JavaFX 8. В настоящее время нет легкого обходного пути. См. Http://stackoverflow.com/questions/29576577/tableview-doesnt-commit-values-on-focus-lost-event –

+0

@Uluk Biy Спасибо! Как я уже сказал, Маэстро! –

ответ

0

Я использовал этот код https://docs.oracle.com/javafx/2/ui_controls/TableViewSample.java.html, и я проверил с затмением отладки, для меня это работает

Вам необходимо ввести в поле и нажать клавишу [ENTER], переключая другую коробку, используя [TAB] может не триггер it

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