Хотел бы я найти это сам (нашел много других полезных ответов - от James_D), но вот моя история.
1) У меня есть «центральный» репозиторий Items , который состоит из объектов с параметрами, как показано ниже:
listOfItems.add(new Item("ABCD", "typeA", new ArrayList<String>(Arrays.asList("10", "20", "30"))));
listOfItems.add(new Item("EFGH", "typeB", new ArrayList<String>(Arrays.asList("40", "50", "60"))));
2) У меня есть табличное представление JavaFx, где я хочу сохранить - в виде строк - некоторые Компоненты , которые состоят из 10 значений, в которых частью этих компонентов являются три столбца / значения из упомянутого репозитория Items @ point number 1 ,
Это заставило меня создать «generateCellValueFactory», которая выглядит следующим образом:
private void generateCellValueFactory(TableColumn<Component, String> column, String name) {
if(name.equals("Items_string_one")) {
column.setCellValueFactory(cellData -> cellData.getValue().getProperty(name));
ArrayList<String> list = itemsRepository.getFirstStrings(); //["ABCD" & "EFGH"]
generateCombo(column, name, list);
} else if (name.equals("Items_lists_of_Strings")) {
column.setCellValueFactory(cellData -> cellData.getValue().getProperty(name));
List<String> list = itemsRepository.getUniqueStringsListsOfStrings();
// ! Unfortunately -> this returns me UNIQUE like list of every string inside those so in our case: ["10", "20", "30", "40", "50", "60"]
generateCombo(column, name, list);
// 8 other columns factories - second string from Item + 7 not a part of "Items" repository. Overall 10 columns.
3) Как мы видим, мы включили внутренний метод generateCombo ->, так как я хочу, чтобы ВСЕ десять ячеек для каждого компонента были "ComboBoxTableCells", и этот элемент отвечает за часть setCellFactory:
private void generateCombo(TableColumn<Component, String> column, String name, List<String> list) {
ObservableList<String> data = FXCollections.observableArrayList(list);
if (name.equals("Items_string_one")) {
column.setCellFactory(new Callback<TableColumn<Component, String>, TableCell<Component, String>>() {
@Override
public TableCell<Component, String> call(TableColumn<Component, String> param) {
ComboBoxTableCell<Component, String> tableCell = new ComboBoxTableCell<Component, String>(data) {
@Override
public void commitEdit(String x) {
// Do something fancy
}
};
return tableCell;
}
});
}else if (name.equals("Items_lists_of_strings")) {
column.setCellFactory(new Callback<TableColumn<Component, String>, TableCell<Component, String>>() {
@Override
public TableCell<Component, String> call(TableColumn<Component, String> param) {
ComboBoxTableCell<Component, String> tableCell = new ComboBoxTableCell<Component, String>(data) {
@Override
public void commitEdit(String x) {
// Do something fancy
}
};
return tableCell;
}
});
}
Вот моя проблема:
Прямо сейчас, когда я выбираю первый столбец, у меня в параметрах comboBox:
x ABCD / EFGH и это прекрасно -> Я рад здесь.
Я также рад, потому что все восемь колонн работают на меня как шарм.
Для столбца "Items_lists_of_Strings" я могу выбрать из уникального списка любой возможности. Не плохо, но и не то, что я действительно хотел, так как я хочу иметь вычисление «spec_errors-proof», следовательно, когда кто-то выбирает ABCD -> он может получить 10/20/30 в другом столбце.
Я хочу, чтобы в этом ComboBoxTableCell параметры "привязывались" к репозиторию Предметов:
IF -> первый столбец -> ABCD
THEN -> ComboBoxTableCell имеет опции «для проверки»: «10», «20», «30».
Я надеюсь, что смогу предоставить каждую деталь. Я попытался сделать код для этой проблемы общим.
Заранее спасибо, и я буду ждать дальнейших вопросов и проблем.