【问题标题】:JavaFX: ComboBox in TableView with different content for each rowJavaFX:TableView 中的 ComboBox,每行内容不同
【发布时间】:2016-07-26 17:18:37
【问题描述】:

我尝试为每一行的组合框创建一个具有不同内容的表格视图。用户可以为每个按钮的表格视图添加一个条目,该条目的对象定义组合框的内容(ObservableList 将在后台更改,意味着单击按钮后它将被新项目填充)。我成功地为每一行创建了一个组合框,但是如果我更改项目,tableview 中每个组合框的内容都会发生变化。

    TableColumn<Filterparameter, String> kenntnisgradComboBoxColumn = new TableColumn<Filterparameter, String>("Ausprägung");
    kenntnisgradComboBoxColumn.setCellValueFactory(new PropertyValueFactory<Filterparameter, String>(""));

    Callback<TableColumn<Filterparameter, String>, TableCell<Filterparameter, String>> cellFactoryKenntnisgradComboBoxColumn = new Callback<TableColumn<Filterparameter, String>, TableCell<Filterparameter, String>>()
    {
        @Override
        public TableCell<Filterparameter, String> call(final TableColumn<Filterparameter, String> param)
        {
            final TableCell<Filterparameter, String> cell = new TableCell<Filterparameter, String>()
            {
                // Display combobox if the row is not empty
                @Override
                public void updateItem(String item, boolean empty)
                {
                    super.updateItem(item, empty);

                    if (empty)
                    {
                        setGraphic(null);
                    }
                    else
                    {
                        tableViewkennntisgradComboBox = new ComboBox<Kenntnisgrad>();
                        // Here content of every combobox changes instead of only changing the combobox of selected row 
                        tableViewkennntisgradComboBox.setItems(selectedFilterParameter.getKenntnisgradAuswahl());

                        tableViewkennntisgradComboBox.setPadding(new Insets(-1, 0, -1, 0));
                        tableViewkennntisgradComboBox.setMinWidth(kenntnisgradComboBoxColumn.getWidth() - 6);
                        tableViewkennntisgradComboBox.setPrefWidth(kenntnisgradComboBoxColumn.getWidth() - 6);
                        tableViewkennntisgradComboBox.setMaxWidth(kenntnisgradComboBoxColumn.getWidth() - 6);

                        setGraphic(tableViewkennntisgradComboBox);
                    }
                }
            };

            return cell;
        }
    };

    kenntnisgradComboBoxColumn.setCellFactory(cellFactoryKenntnisgradComboBoxColumn);

尝试将 tableview 可视化以便更好地理解:

|文本   |组合框    |
|文本1 | [内容列表1 >] |
|文本2 | [内容列表2>] |
| ........ | [.......................] |

非常感谢!

【问题讨论】:

  • 你需要tableViewkennntisgradComboBox作为单元格中的一个字段,(所以每个单元格都有自己的组合框,现在看起来每个单元格都共享同一个),这将是最简单的如果要显示的值列表是Filterparameter 的属性(至少需要一种方法将每个Filterparameter 映射到要在相应行的组合框中显示的值列表)。
  • 嗨,詹姆斯,感谢您的回答。 “现在看起来每个单元格都共享同一个单元格” - 也是这样想的。而且我在Filterparameter中也有一个属性,它叫做“kenntnisgradAuswahl”。它是一个 ObservableList,它在发布的源代码中由“[...].getKenntnisgradAuswahl()”调用。我从 Uluk Biy 的此处 (stackoverflow.com/questions/29387386/…) 找到了一些代码,但组合框的内容是在编辑事件上设置的,而不是在 updateEvent 上设置的。我尝试移植它以符合我的意图,但没有成功。
  • 所以将组合框项目设置为getTableView().getItems().get(getIndex()).getKenntnisgradAuswahl()。 (但为每个单元格定义一个组合框。)
  • "但是为每个单元格定义一个组合框。"我以为我已经这样做了,因为我调用了“tableViewkennntisgradComboBox = new ComboBox();”。但显然它总是相同的组合框对象..我不知道为什么..
  • 啊,是的,每次调用updateItem 时,您都会创建一个新的。这可能太多了(性能方面),但它应该确实有效。

标签: javafx combobox set tableview


【解决方案1】:

您似乎将组合框的项目设置为从某个固定模型实例中检索到的项目,而不是从显示单元格的行所代表的模型实例中检索到的项目。

替换

tableViewkennntisgradComboBox.setItems(selectedFilterParameter.getKenntnisgradAuswahl());

tableViewkennntisgradComboBox.setItems(getTableView().getItems().get(getIndex()).getKenntnisgradAuswahl());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2014-07-11
    • 2022-11-04
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多