У меня есть class, содержащий String и HashMap. Я хочу поместить значение string в первый столбец и динамически создавать столбцы, чтобы соответствовать HashMap, где его ключами будут имена столбцов, а его строки значений.
Итак, в основном у меня такая же проблема, как здесь:
Подключите столбцы TableView к значениям HashMap
Однако, попробовав ответ, представленный в этом вопросе, я столкнулся с исключением / предупреждением, и каждый раз, когда я пытался его обойти, он все равно выскакивал, и, честно говоря, я как бы теряю его. Подробности в коде.
Студенческий класс
Class Mark {
private String studentName;
private HashMap<String, SimpleDoubleProperty> marks;
// Getters and setters and whatnot.
Связанный код в классе контроллера
....
@FXML
TableView<Mark> marksTable;
....
private void loadMarksTable(ObservableList<Mark> marks) {
marksTable.setItems(marks);
marksTable.setVisible(true);
TableColumn<Mark, String> column = new TableColumn<Mark, String>("student name");
column.setCellValueFactory(cd -> new SimpleStringProperty(cd.getValue().getStudentName()));
marksTable.getColumns().add(column);
for (Entry<String, SimpleDoubleProperty> entry: marks.get(0).getMarks().entrySet()) {
// Instead of Number I tried a lot of things, including Double and SimpleDoubleProperty
TableColumn<Mark, Number> col = new TableColumn<Mark, Number>(entry.getKey());
/*
* Warning here (underlines code starting from cd ->) : type mismatch: cannot convert from SimpleDoubleProperty to ObservableValue<String>
*/
col.setCellValueFactory(cd -> cd.getValue().getMarks().get(entry.getKey()));
marksTable.getColumns().add(col);
}
Перед циклом для добавления столбцов я попытался создать метод, который будет столбцом, но NullPointerException появится, когда я попытаюсь загрузить таблицу:
Добавить столбец метод
private void addColumn(String keyName) {
TableColumn<Mark, Double> column = new TableColumn<Mark, Double>(keyName);
column.setCellValueFactory(cd -> cd.getValue().getMarks().get(keyName).asObject()); // <- NullPointerException. Also tried without .asObject()
marksTable.getColumns().add(column);
Было бы очень полезно подробное объяснение того, как это работает.
@fabian name - это опечатка. Должен быть keyName - редактировал соответственно. Я попробовал очистить и восстановить, и это не сработало. Я пошел дальше и импортировал весь проект в NetBeans, и, как ни странно, это сработало. Я удалил eclipse, переустановил его и загрузил все плагины, затем снова импортировал проект, и он сработал. Значит, причиной этого была ошибка в eclipse? странный. Может это одна из импортированных библиотек? В любом случае, спасибо за помощь, я скоро отправлю ответ.




Предупреждение не должно происходить с объявленными типами. (В частности,
ObservableValue<String>не должен использоваться в качестве целевого типа, если второй параметр типа столбца не являетсяString.) Вероятно, ваша IDE не обновилась. Попробуйте очистить и восстановить функциональность среды IDE. Что касаетсяNullPointerException: либоgetMarks(), либоgetMarks().get(name)возвращаетnull, это строка, вызывающая исключение; все ли карты содержат одинаковые ключи? Откуда беретсяname?