使用Java-FX修复了单元格大小表

时间:2014-10-27 13:22:39

标签: java javafx tableview

我已经和它斗争了一段时间,终于想到我需要一些帮助。

我正在尝试创建一个表格,其中每个单元格显示特定的颜色。这是基于用户选择的图像动态创建的。

我让它使用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()));
    }
}
}

1 个答案:

答案 0 :(得分:0)

创建TableView<S>时,S是表格每行中显示的对象类型。表的items属性是ObservableList<S>,包含项集合,每个项目都显示在表格行中。

如果您的数据采用ObservableList<ObservableList<Stitch>> stitchList格式,则需要TableView<ObservableList<Stitch>>。 (换句话说,SObservableList<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);
    }
}