ComboBox在JavaFX中的tableview单元格中 [英] ComboBox in a tableview cell in JavaFX

查看:1092
本文介绍了ComboBox在JavaFX中的tableview单元格中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试向我的表视图中添加组合框

I'm trying to a add a Combo Box to my Table View:

基本上我有一个名为TableViewTest的类存储一个名称和描述,我可以显示这些名称和描述在表视图没有麻烦,但我想做的是添加第三列,每个单元格都有一个组合框,以便用户可以从每个人的多个选项中选择一个。

Basically I have a class called TableViewTest that stores a name and a description, I can display theses names and descriptions in a Table View no bother, but what I want to do is add a third column with each cell having a Combo Box so that the user can select one from a number of options for each person.

到目前为止,我创建了一个 ObservableList 类型 String 与一些值,并将它们添加到 ComboBox 对象。有没有人知道一个方法,我把这个组合框添加到表中?

So far I have created an ObservableList of type String with some values and added them to a ComboBox object. Does anyone know a way for me to add this Combo Box to the table?

是非常粗糙,我只是想让一些工作,我会在以后的日期重构代码。

Also bear in mind this code is pretty rough and I'm just trying to get something working and I'll be refactoring the code at a later date.

ObservableList<TableViewTest> products = FXCollections.observableArrayList();

    for(int i = 0; i < b.length; i++){

        // random String values
        products.add(new TableViewTest(b[i], a[i]));
    }

ObservableList<String> options = FXCollections.observableArrayList(
                                "1",
                                "2",
                                "3"
                                );
final ComboBox comboBox = new ComboBox(options);

TableColumn<TableViewTest, String> nameColumn = new TableColumn<> ("Name");
nameColumn.setMinWidth(200);
nameColumn.setCellValueFactory(new PropertyValueFactory<TableViewTest, String>("name"));

                //price Column
                //Stock Column
TableColumn<TableViewTest, String> StockColumn = new TableColumn<> ("Stock");
StockColumn.setMinWidth(150);
StockColumn.setCellValueFactory(new PropertyValueFactory<TableViewTest, String>("description"));


TableColumn<Object,ComboBox> PriceColumn;
PriceColumn = new TableColumn<>("Source");
PriceColumn.setMinWidth(150);
   //PriceColumn.setCellValueFactory(new PropertyValueFactory<>
   //(options));

   //PriceColumn.setCellFactory(ComboBoxTableCell.forTableColumn(new 
   //DefaultStringConverter(), options));


   //PriceColumn.setCellFactory(ComboBoxTableCell.forTableColumn( 
   //comboBox));

TableView<TableViewTest> table = new TableView<>();

table.setItems(products);
table.getColumns().addAll(nameColumn, StockColumn, PriceColumn);


推荐答案

James_D的回答效果很好,但需要用户点击在项目上查看 ComboBox 。如果你想在列中有 ComboBox es,总是显示,你必须使用自定义的 cellFactory

James_D's answer works well, but requires the user to click on the item to see the ComboBox. If you want to have ComboBoxes in a column, that are always shown, you have to use a custom cellFactory:

public class TableViewTest {

    ...

    private final StringProperty option = new SimpleStringProperty();

    public String getOption() {
        return option.get();
    }

    public void setOption(String value) {
        option.set(value);
    }

    public StringProperty optionProperty() {
        return option;
    }

}





    TableColumn<TableViewTest, StringProperty> column = new TableColumn<>("option");
    column.setCellValueFactory(i -> {
        final StringProperty value = i.getValue().optionProperty();
        // binding to constant value
        return Bindings.createObjectBinding(() -> value);
    });

    column.setCellFactory(col -> {
        TableCell<TableViewTest, StringProperty> c = new TableCell<>();
        final ComboBox<String> comboBox = new ComboBox<>(options);
        c.itemProperty().addListener((observable, oldValue, newValue) -> {
            if (oldValue != null) {
                comboBox.valueProperty().unbindBidirectional(oldValue);
            }
            if (newValue != null) {
                comboBox.valueProperty().bindBidirectional(newValue);
            }
        });
        c.graphicProperty().bind(Bindings.when(c.emptyProperty()).then((Node) null).otherwise(comboBox));
        return c;
    });

这篇关于ComboBox在JavaFX中的tableview单元格中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆