我已经和它斗争了一段时间,终于想到我需要一些帮助。
我正在尝试创建一个表格,其中每个单元格显示特定的颜色。这是基于用户选择的图像动态创建的。
我让它使用TilePane,但由于表的大小,它运行速度非常慢。
目前,我正在尝试使用TableView使其工作。正在创建TableView,但未填充。我创建TableView的代码和我的自定义TableCell类如下所示。
我的主要问题是:这是最好的解决方法吗?如果是这样,我做错了什么?
提前感谢您在此处看到的非常棒的帮助。
创建TableView的代码:
private ObservableList<ObservableList<Stitch>> stitchList;
private TableView<Stitch> pattern;
@Override
protected TableView<Stitch> call() throws Exception {
for (int i=0; i< stitchList.size(); i++) {
TableColumn<Stitch, Color> column = new TableColumn<>();
column.setCellValueFactory(new Callback<CellDataFeatures<Stitch, Color>, ObservableValue<Color>>() {
public ObservableValue<Color> call(CellDataFeatures<Stitch, Color> stitch) {
return stitch.getValue().getDisplayColorProperty();
}
});
column.setCellFactory(new Callback<TableColumn<Stitch, Color>, TableCell<Stitch, Color>>() {
@Override public TableCell<Stitch, Color> call(TableColumn<Stitch, Color> list) {
return new StitchCell();
}
});
//Set column sizes
column.setMinWidth(10);
column.setMaxWidth(10);
pattern.getColumns().add(column);
}
return pattern;
} // End Call
自定义单元格类的代码
public class StitchCell extends TableCell<Stitch, Color> {
@Override
protected void updateItem(Color color, boolean empty) {
super.updateItem(color, empty);
if (empty || color == null) {
this.setStyle("-fx-background-color: white");
} else {
this.setStyle("-fx-background-color: #" + Integer.toHexString(color.hashCode()));
}
}
}
答案 0 :(得分:0)
创建TableView<S>
时,S
是表格每行中显示的对象类型。表的items
属性是ObservableList<S>
,包含项集合,每个项目都显示在表格行中。
如果您的数据采用ObservableList<ObservableList<Stitch>> stitchList
格式,则需要TableView<ObservableList<Stitch>>
。 (换句话说,S
是ObservableList<Stitch>
。stitchList
的每个元素,ObservableList<Stitch>
代表表中的一行。
TableView
未设计为ObservableList<ObservableList>
作为表示数据的主要用例,因此您需要做一些工作才能使cellValueFactory
正常工作。如果您确定每一行都有相同数量的项目,您可以稍微减少一点,但您需要以下内容:
TableView<ObservableList<Stitch>> pattern = new TableView<>();
ObservableList<ObservableList<Stitch>> stitchList = ... ;
// Set items (i.e. rows) in table:
pattern.setItems(stitchList);
// iterate through all rows:
for (ObservableList<Stitch> row : pattern) {
// if this row contains more elements than columns we have already created,
// (must be true on first row, may be true on subsequent rows if data not rectangular)
// create a new column for each additional element
for (int i = pattern.getColumns().size(); i < row.size() ; i++) {
TableColumn<ObservableList<Stitch>, Color> column = new TableColumn<>();
final int columnIndex = i ;
column.setCellValueFactory(new Callback<CellDataFeatures<ObservableList<Stitch>, Color>, ObservableValue<Color>>() {
@Override
public ObservableValue<Stitch> call(CellDataFeatures<ObservableList<Stitch>, Stitch>> stitch) {
return stitch.getValue() // the row value, i.e. an ObservableList<Stitch>
.get(columnIndex) // the Stitch for this cell
.getDisplayColorProperty();
}
});
column.setCellValueFactory(new Callback<TableColumn<ObservableList<Stitch>, Color>, TableCell<ObservableList<Stitch>, Color>>() {
@Override
public TableCell<ObservableList<Stitch>, Color> call(TableColumn<ObservableList<Stitch>, Color> col) {
return new StitchCell();
}
});
column.setMinWidth(10);
column.setMaxWidth(10);
pattern.getColumns().add(column);
}
}
如果您使用的是Java 8,则可以使用lambda表达式替换Callback
s,并删除代码中最丑陋的部分:
for (ObservableList<Stitch> row : pattern) {
// if this row contains more elements than columns we have already created,
// (must be true on first row, may be true on subsequent rows if data not rectangular)
// create a new column for each additional element
for (int i = pattern.getColumns().size(); i < row.size() ; i++) {
TableColumn<ObservableList<Stitch>, Color> column = new TableColumn<>();
final int columnIndex = i ;
column.setCellValueFactory( rowData ->
rowData.getValue() // the row value, i.e. an ObservableList<Stitch>
.get(columnIndex) // the Stitch for this cell
.getDisplayColorProperty() );
column.setCellValueFactory(col -> new StitchCell());
column.setMinWidth(10);
column.setMaxWidth(10);
pattern.getColumns().add(column);
}
}