更改tableview单元格颜色以单击

时间:2018-04-24 02:25:07

标签: java tableview javafx-8 listener

我有一个表示日历的TableView。每个细胞都是一天。我想向细胞添加一个事件。单击单元格时,背景必须更改为红色...应该可以选择多个单元格

1 个答案:

答案 0 :(得分:0)

如果只是您需要的选择,您可以使用具有多个选择的选择模型和单元格选择模式。

table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
table.getSelectionModel().setCellSelectionEnabled(true);

CSS样式表

.table-cell {
    -fx-selection-bar: red;
    -fx-selection-bar-non-focused: red;
}

如果您不想使用选择模型,则需要将数据存储在商品中并使用自定义TableCell

public class DayCell extends TableCell<Week, Boolean> {

    {
        setOnMouseClicked(evt -> {
            if (!isEmpty() && getItem() != null && evt.getButton() == MouseButton.PRIMARY) {
                WritableValue<Boolean> property = (WritableValue<Boolean>) getTableColumn().getCellObservableValue((Week) getTableRow().getItem());
                property.setValue(!getItem());
            }
        });
    }


    @Override
    protected void updateItem(Boolean item, boolean empty) {
        super.updateItem(item, empty);

        if (empty || item == null) {
            setStyle(null);
        } else {
            setStyle(item ? "-fx-background-color: red;" : null);
        }
    }
}
column.setCellFactory(c -> new DayCell());

这需要ObservableValue返回的cellValueFactory以一种将数据存储在表项类中的方式实现WritableValue<Boolean>。使用存储在此类中的BooleanProperty可以解决问题。

我不认为在这种情况下使用TableView是个好主意。它不是为了显示固定大小的不可调整大小的网格而设计的。