2015-01-31 2 views
2

Я пытаюсь сделать ячейки таблицы доступными для редактирования. Мне удалось сделать это с помощью двух Collumns, в которых есть значения String, но я не могу сделать это с помощью столбцов, которые представляют значения Integer.TableView, настройка редактируемых ячеек

мест с X, где компилятор получает ошибку:

The method setCellFactory(Callback<TableColumn<DataModel,Integer>,TableCell<DataModel,Integer>>) in the type TableColumn<DataModel,Integer> is not applicable for the arguments (Callback<TableColumn<DataModel,String>,TableCell<DataModel,String>>) 

и место с XX, где компилятор получает ошибку:

The method setOnEditCommit(EventHandler<TableColumn.CellEditEvent<DataModel,Integer>>) in the type TableColumn<DataModel,Integer> is not applicable for the arguments ((CellEditEvent<DataModel, Integer> event) -> {}) 

Heres код:

public void initialize(URL location, ResourceBundle resources) { 
    //Tworzymy sobie kolumny, które będą odpowiadać oraz przyjmować konretne dane 
    TableColumn<DataModel, String> nameColumn = new TableColumn<DataModel, String>("Name"); 
    nameColumn.setMinWidth(100); 
    TableColumn<DataModel, String> surnameColumn = new TableColumn<DataModel, String>("Surname"); 
    surnameColumn.setMinWidth(100); 
    TableColumn<DataModel, Integer> ageColumn = new TableColumn<DataModel, Integer>("Age"); 
    ageColumn.setMinWidth(100); 
    TableColumn<DataModel, Integer> telNumberColumn = new TableColumn<DataModel, Integer>("Tel. Number"); 
    telNumberColumn.setMinWidth(100); 

    //dodajemy kolumny do okna 
    tableView.getColumns().addAll(nameColumn,surnameColumn,ageColumn,telNumberColumn); 

    //podajemy nazwy zmiennych, których wartości mają się wyświetlać w poszczególnych kolumnach 
    nameColumn.setCellValueFactory(new PropertyValueFactory<>("sName")); 
    surnameColumn.setCellValueFactory(new PropertyValueFactory<>("sSurname")); 
    ageColumn.setCellValueFactory(new PropertyValueFactory<>("iAge")); 
    telNumberColumn.setCellValueFactory(new PropertyValueFactory<>("iPhoneNumber")); 

    //Sprawiamy że poszczególne kolumny stają się edytowalne 
    nameColumn.setCellFactory(TextFieldTableCell.<DataModel>forTableColumn()); 
    nameColumn.setOnEditCommit((CellEditEvent<DataModel, String> event) -> { 
     ((DataModel) event.getTableView().getItems(). get(event.getTablePosition().getRow())). setsName(event.getNewValue()); 
    }); 
    surnameColumn.setCellFactory(TextFieldTableCell.<DataModel>forTableColumn()); 
    surnameColumn.setOnEditCommit((CellEditEvent<DataModel, String> event) -> { 
     ((DataModel) event.getTableView().getItems(). get(event.getTablePosition().getRow())). setsSurname(event.getNewValue()); 
    }); 
X ageColumn.setCellFactory(TextFieldTableCell.<DataModel>forTableColumn()); 
XX ageColumn.setOnEditCommit((CellEditEvent<DataModel, Integer> event) -> { 
    // ((DataModel) event.getTableView().getItems(). get(event.getTablePosition().getRow())). setiAge(Integer.valueOf(event.getNewValue())); 

    }); 
X telNumberColumn.setCellFactory(TextFieldTableCell.<DataModel>forTableColumn()); 
XX telNumberColumn.setOnEditCommit((CellEditEvent<DataModel, Integer> event) -> { 
//   ((DataModel) event.getTableView().getItems(). get(event.getTablePosition().getRow())). setiPhoneNumber(Integer.valueOf(event.getNewValue())); 

    }); 

    tableView.setPlaceholder(new Label("Pust tabelka!"));//jaki element dodać jeśli tabelka nie jest wyświetlona 
    tableView.setEditable(true); 

    tableView.setItems(dataList); //wczytujemy dane do przygotowanej tabelki 

    buttAdd.setOnAction((ActionEvent e) -> { 
     buttAddAction(e); 
    }); 
} 

Im принимает оракул TableView учебник, и его довольно сложно. Помогите.

+0

А что такое ошибка? Трассировки стека? – eckig

+0

См. Объяснение в начале. Его ошибка компилятора. Я не могу запустить программу. – Tomasz

+0

К сожалению, я не видел эту строку на первый взгляд, мой плохой. – eckig

ответ

6

Проблема заключается в том, что TextFieldTableCell.forTableColumn() вводится в строковое значение. См реализацию по умолчанию:

public static <S> Callback<TableColumn<S,String>, TableCell<S,String>> forTableColumn() { 
    return forTableColumn(new DefaultStringConverter()); 
} 

Что вам нужно, это TextFieldTableCell с IntegerStringConverter, например:

ageColumn.setCellFactory(TextFieldTableCell.<DataModel, Integer>forTableColumn(new IntegerStringConverter())); 
+0

Я старался делать пользовательские события редактирования ячеек, как показано в учебнике Oracle, и работает, когда его свойство String и не работает для SimpleIntegerValues. Опять проблема с типами. Итак, не лучше ли держать каждую переменную в классе данных (например, DataModel) SimpleStringProperty, чтобы избежать подобных преобразований? – Tomasz

+0

Если у вас есть дополнительные вопросы, пожалуйста, задайте им новые темы здесь, на SO, раздел комментариев не подходит для этого ;-) – eckig

+0

@eckig - Ты спас мне жизнь :) –

3

Я искал через много ответов, и я заимствовал/расширенный/слилась с этим решение. Редактирование происходит, когда фокус перемещается из редактируемой ячейки. У меня есть открытый класс для каждого типа данных, который может быть представлен в таблице: EditingTextCell, EditingIntegerCell и т. Д. Эти общедоступные классы могут применяться к любой таблице при условии, что данные представлены как наблюдаемый список класса, который обращается к отображаемым данным как свойства. Я публикую это решение, потому что столкнулся с созданием класса для каждого столбца каждой таблицы в моем приложении. В настоящее время версии ячейки double value и combobox привязаны к определенным столбцам конкретных таблиц. Я сделаю обобщенную версию этих данных, если позволит время. Пожалуйста, простите, что я не представил ссылки на источник - я забыл их добавлять, поскольку я их просмотрел.

Документация по Java предполагает, что более легкие способы сделать это готовы.

Пример использования для поля Integer:

TableColumn<Factor, Number> noLevelsCol = 
      new TableColumn<>("No. Levels"); 
    noLevelsCol.setCellValueFactory(
      new PropertyValueFactory("numberLevels")); 
    noLevelsCol.setMinWidth(40); 
    noLevelsCol.setCellFactory(col -> new EditingIntegerCell<>()); 
    noLevelsCol.setOnEditCommit((CellEditEvent<Factor, Number> t) -> { 
     ((Factor) t.getTableView().getItems().get(
       t.getTablePosition().getRow()) 
       ).setNumberLevels(t.getNewValue().intValue()); 
    }); 

Пример использования для поля Строка:

TableColumn<Factor, String> nameCol = new TableColumn<>("Name"); 
    nameCol.setMinWidth(60); 
    nameCol.setCellValueFactory(
      new PropertyValueFactory("factorName")); 
    nameCol.setCellFactory(cellFactory); 
    nameCol.setOnEditCommit((CellEditEvent<Factor, String> t) -> { 
     ((Factor) t.getTableView().getItems().get(
       t.getTablePosition().getRow()) 
       ).setFactorName(t.getNewValue()); 
    }); 

Определение фактора класса: общественного класса Factor {

private final IntegerProperty factorID = new SimpleIntegerProperty(); 
public IntegerProperty getFactorID() {  return factorID; } 

private StringProperty factorName = new SimpleStringProperty(); 
public void setFactorName(String value) { 
      factorNameProperty().set(value); } 
public String getFactorName() { return factorNameProperty().get(); } 
public StringProperty factorNameProperty() { 
    if (factorName == null) factorName = 
     new SimpleStringProperty(this, "factorName"); 
    return factorName; 
} 

private IntegerProperty numberLevels = new SimpleIntegerProperty(); 
public void setNumberLevels(int value) { 
     numberLevelsProperty().set(value); } 
public IntegerProperty getNumberLevels() { return numberLevels; } 
public IntegerProperty numberLevelsProperty() { 
    if (numberLevels == null) numberLevels = 
      new SimpleIntegerProperty(this, "numberLevels"); 
    return numberLevels; 
} 

private StringProperty listOfLevels = new SimpleStringProperty(); 
public void setListOfLevels(String value) { 
     listOfLevelsProperty().set(value); } 
public String getListOfLevels() { return listOfLevelsProperty().get(); } 
public StringProperty listOfLevelsProperty() { 
    if (listOfLevels == null) listOfLevels = 
      new SimpleStringProperty(this, "listOfLevels"); 
    return listOfLevels; 
} 


// Constructors 
public Factor(int factorID, String factorName) { 
    this.factorID.set(factorID); 
    this.factorName.set(factorName); 
    this.numberLevels.set(1); 
    this.listOfLevels.set("-1, 1"); 
} 

public Factor(int factorID, String factorName, int numberLevels, 
       String listOfLevels) { 
    this.factorID.set(factorID); 
    this.factorName.set(factorName); 
    this.numberLevels.set(numberLevels); 
    this.listOfLevels.set(listOfLevels); 
} 

@Override 
public String toString() { 
    return "Factor{" + "factorName=" + factorName + '}'; 
} 

public String[] getLevels() { 
    return listOfLevels.getValue().split(","); 
} 

}

Загрузка данных в таблицу Окончательный ObservableList factorList = FXCollections.observableArrayList ( новый коэффициент (1, «фактор 1», 2, «-1, 1») );

factorTableView.setEditable(true); 
    factorTableView.getColumns().clear(); 
    factorTableView.setItems(factorList); 
    boolean addAll; 
    addAll = factorTableView.getColumns().addAll(idCol, 
        nameCol, noLevelsCol, levelsCol); 

Класс EditingIntegerCell общественного класса EditingIntegerCell расширяет TableCell {

private TextField textField; 
    private final Pattern intPattern = Pattern.compile("-?\\d+"); 

    public EditingIntegerCell() { 
    } 

    @Override 
    public void startEdit() { 
     if (!isEmpty()) { 
      super.startEdit(); 
      createTextField(); 
      setText(null); 
      setGraphic(textField); 
      textField.selectAll(); 
     } 
    } 

    @Override 
    public void cancelEdit() { 
     super.cancelEdit(); 

     setText((String) getItem().toString()); 
     setGraphic(null); 
    } 

    @Override 
    public void updateItem(Number 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(
      (ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) 
         -> { 
      if (!arg2) { 
       processEdit(); 
      } 
     }); 
    } 

    private void processEdit() { 
     String text = textField.getText(); 
     if (intPattern.matcher(text).matches()) { 
      commitEdit(Integer.parseInt(text)); 
     } else { 
      cancelEdit(); 
     } 
    } 

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

** Класс EditingTextCell ** общественный класс EditingTextCell расширяет TableCell {

private TextField textField; 

    public EditingTextCell() { 
    } 

    @Override 
    public void startEdit() { 
     if (!isEmpty()) { 
      super.startEdit(); 
      createTextField(); 
      setText(null); 
      setGraphic(textField); 
      textField.selectAll(); 
     } 
    } 

    @Override 
    public void cancelEdit() { 
     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(
      (ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) 
         -> { 
      if (!arg2) { 
       commitEdit(textField.getText()); 
      } 
     }); 
    } 

    private String getString() { 
     return getItem() == null ? "" : getItem(); 
    } 
} 
Смежные вопросы