У меня есть 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);
Подробное объяснение того, как это работает, будет высоко оценено.