为了账号安全,请及时绑定邮箱和手机立即绑定

JAVAFX:Tableview行选择行为

JAVAFX:Tableview行选择行为

收到一只叮咚 2021-04-09 10:53:50
我有以下代码来设置a的背景颜色TableRow,column.setCellFactory((TableColumn<Model, Integer> p) -> {           ComboBoxTableCell cell = new ComboBoxTableCell(FXCollections.observableArrayList(0, 1)) {               @Override               public void updateItem(Object item, boolean empty) {                   super.updateItem(item, empty);                   if (!empty && item != null) {                       if(Integer.valueOf(item.toString()) == 1){                           getTableRow().setStyle("-fx-background-color: khaki;");                       }else if(Integer.valueOf(item.toString()) == 0){                           getTableRow().setStyle(null);                       }                   }               }           };           return cell;        });问题是当我选择背景设置为某种颜色的行时,指示选择的默认蓝色会落后。(如下所示)如何保留默认选择颜色?
查看完整描述

1 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

内联样式比CSS样式表具有更高的优先级。因此,所选行的背景也将被覆盖。构造背景的方式要求您使用“指定”-fx-control-inner-background-alt和“-fx-control-inner-background代替”。


[...].setStyle("-fx-control-inner-background: khaki; -fx-control-inner-background-alt: khaki;")

但是,存在一个更严重的问题:


您可以从设置样式TableCell。由于TableView负责将项目分配给单元格,因此,如果您在不同的列中使用单元格类型,则完成的顺序是实现细节,会导致任意结果。即使仅在一列中使用这些单元格,也永远不会处理单元格为空的情况,因此即使是空单元格也可能仍包含新颜色。


行样式属于表行。


如果您使用PseudoClass和CSS样式表,那么您还将获得最大的灵活性。


例如


final PseudoClass one = PseudoClass.getPseudoClass("one");

tableView.setRowFactory(t -> new TableRow<Model>() {


    private ChangeListener<Integer> listener = (o, oldValue, newValue) -> {

        pseudoClassStateChanged(one, newValue == 1);

    };


    @Override

    protected void updateItem(Model model, boolean empty) {

        if (getItem() != null) {

            getItem().myValueProperty().removeListener(listener);

        }


        super(model, empty);


        if (empty || model == null) {

            listener.changed(null, 0, -1);

        } else {

            model.myValueProperty().addListener(listener);

            listener.changed(null, 0, model.getMyValue());

        }

    }



});

CSS样式表


.table-row-cell:one {

    -fx-control-inner-background: khaki;

    -fx-control-inner-background-alt: khaki;

}

此外,你应该使用类型参数,以避免转换到您的项目Integer,以String和回Integer(这应该由一个投来代替,如果它需要做这样的。在这种情况下,最好不要使用原始类型)。


final ObservableList<Integer> values = FXCollections.observableArrayList(0, 1);


column.setCellFactory((TableColumn<Model, Integer> p) -> {

    ComboBoxTableCell<Model, Integer> cell = new ComboBoxTableCell<Model, Integer>(values) {

        @Override

        protected void updateItem(Integer item, boolean empty) {

            ...

        }

    };

    return cell;

});


查看完整回答
反对 回复 2021-04-28
  • 1 回答
  • 0 关注
  • 680 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信