Issue
I'm trying to a add a Combo Box
to my Table View
:
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.
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);
Solution
James_D's answer works well, but requires the user to click on the item to see the ComboBox
. If you want to have ComboBox
es in a column, that are always shown, you have to use a custom cellFactory
:
Example:
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;
});
Answered By - fabian
Answer Checked By - Katrina (JavaFixing Volunteer)