猿问

JAVAFX:Tableview行选择行为

我有以下代码来设置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;

        });

问题是当我选择背景设置为某种颜色的行时,指示选择的默认蓝色会落后。(如下所示)

如何保留默认选择颜色?


收到一只叮咚
浏览 681回答 1
1回答

拉丁的传说

内联样式比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>() {&nbsp; &nbsp; private ChangeListener<Integer> listener = (o, oldValue, newValue) -> {&nbsp; &nbsp; &nbsp; &nbsp; pseudoClassStateChanged(one, newValue == 1);&nbsp; &nbsp; };&nbsp; &nbsp; @Override&nbsp; &nbsp; protected void updateItem(Model model, boolean empty) {&nbsp; &nbsp; &nbsp; &nbsp; if (getItem() != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; getItem().myValueProperty().removeListener(listener);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; super(model, empty);&nbsp; &nbsp; &nbsp; &nbsp; if (empty || model == null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listener.changed(null, 0, -1);&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; model.myValueProperty().addListener(listener);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listener.changed(null, 0, model.getMyValue());&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }});CSS样式表.table-row-cell:one {&nbsp; &nbsp; -fx-control-inner-background: khaki;&nbsp; &nbsp; -fx-control-inner-background-alt: khaki;}此外,你应该使用类型参数,以避免转换到您的项目Integer,以String和回Integer(这应该由一个投来代替,如果它需要做这样的。在这种情况下,最好不要使用原始类型)。final ObservableList<Integer> values = FXCollections.observableArrayList(0, 1);column.setCellFactory((TableColumn<Model, Integer> p) -> {&nbsp; &nbsp; ComboBoxTableCell<Model, Integer> cell = new ComboBoxTableCell<Model, Integer>(values) {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; protected void updateItem(Integer item, boolean empty) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };&nbsp; &nbsp; return cell;});
随时随地看视频慕课网APP

相关分类

Java
我要回答