我尝试使用ComboxBoxTableCell
没有成功。
单元格的内容显示对象属性的正确值。但是当显示组合框时,所有项目都使用toString
对象方法而不是属性显示。
我试图覆盖updateItem
或ComboBoxTableCell
提供一个StringConverter
但没有任何效果。
您对在表格单元格中自定义组合框列表显示有一些想法吗?
我在下面放了一个简短的例子来快速查看问题。执行应用程序并单击单元格,您将看到包含toString
对象值的组合框。
package javafx2;
import javafx.application.Application;
import javafx.beans.property.adapter.JavaBeanObjectPropertyBuilder;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.ComboBoxTableCell;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.StringConverter;
public class ComboBoxTableCellTest extends Application {
public class Product {
private String name;
public Product(String name) {
this.name = name;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
public class Command {
private Integer quantite;
private Product product;
public Command(Product product, Integer quantite) {
this.product = product;
this.quantite = quantite;
}
public Integer getQuantite() { return quantite; }
public void setQuantite(Integer quantite) { this.quantite = quantite; }
public Product getProduct() { return product; }
public void setProduct(Product product) { this.product = product; }
}
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Product p1 = new Product("Product 1");
Product p2 = new Product("Product 2");
final ObservableList<Product> products = FXCollections.observableArrayList(p1, p2);
ObservableList<Command> commands = FXCollections.observableArrayList(new Command(p1, 20));
TableView<Command> tv = new TableView<Command>();
tv.setItems(commands);
TableColumn<Command, Product> tc = new TableColumn<Command, Product>("Product");
tc.setMinWidth(140);
tc.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Command,Product>, ObservableValue<Product>>() {
@Override
public ObservableValue<Product> call(CellDataFeatures<Command, Product> cdf) {
try {
JavaBeanObjectPropertyBuilder<Product> jbdpb = JavaBeanObjectPropertyBuilder.create();
jbdpb.bean(cdf.getValue());
jbdpb.name("product");
return (ObservableValue) jbdpb.build();
} catch (NoSuchMethodException e) {
System.err.println(e.getMessage());
}
return null;
}
});
final StringConverter<Product> converter = new StringConverter<ComboBoxTableCellTest.Product>() {
@Override
public String toString(Product p) {
return p.getName();
}
@Override
public Product fromString(String s) {
// TODO Auto-generated method stub
return null;
}
};
tc.setCellFactory(new Callback<TableColumn<Command,Product>, TableCell<Command,Product>>() {
@Override
public TableCell<Command, Product> call(TableColumn<Command, Product> tc) {
return new ComboBoxTableCell<Command, Product>(converter, products) {
@Override
public void updateItem(Product product, boolean empty) {
super.updateItem(product, empty);
if (product != null) {
setText(product.getName());
}
}
};
}
});
tv.getColumns().add(tc);
tv.setEditable(true);
Scene scene = new Scene(tv, 140, 200);
stage.setScene(scene);
stage.show();
}
}