【问题标题】:Changing background colour in TableCell removes selection colour, makes it hard to read在 TableCell 中更改背景颜色会删除选择颜色,使其难以阅读
【发布时间】:2019-04-08 20:33:45
【问题描述】:

我做了这个改变:

Change TableColumn background in TableView, whilst retaining alternating row colour?

未选中看起来不错:

:

但是当你选择一个单元格时:

看起来像这样,但我希望它在被选中/聚焦时正常运行。

我很确定我需要使用样式类,但是,我不知道您需要什么属性来保留 TableCell 的所有其他功能,只是使用不同的颜色背景。另外,我是在单元级别还是在列级别应用样式类?

更新

我的 css 文件: 自定义.css

.customhighlight .table-cell {
    -fx-background-color: rgba(0, 128, 0, 0.3);
}

.customhighlight .table-cell:selected {
    -fx-background-color: inherit;
}

如何将其应用于一列?

我试过了

table.getStyleClass().add("customhighlight");

但是,它改变了整个表格。

我试过了

tableCol.getStyleClass().add("customhighlight");

它什么也没做。

我也在单元格级别尝试过...

【问题讨论】:

    标签: java css javafx


    【解决方案1】:

    如果我理解正确,你想要:

    • 一列的所有单元格都具有半透明背景。
    • 这些单元格在被选中时应该看起来像默认的modena.css 选中的样子。
      • 换句话说,将半透明背景替换为深蓝色,文本变为白色。

    您应该将样式类添加到相应的单元格中,然后您可以在 CSS 文件中使用该样式类。这是一个小例子:

    Main.java

    import static java.util.stream.Collectors.collectingAndThen;
    import static java.util.stream.Collectors.toCollection;
    
    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.scene.Scene;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.stage.Stage;
    import javafx.util.Pair;
    
    public class Main extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            var table = System.getProperties().stringPropertyNames().stream()
                    .map(name -> new Pair<>(name, System.getProperty(name)))
                    .collect(collectingAndThen(toCollection(FXCollections::observableArrayList), TableView::new));
            table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
            table.getSelectionModel().setCellSelectionEnabled(true); // Not sure if you're using cell or row selection
    
            var keyCol = new TableColumn<Pair<String, String>, String>("Key");
            keyCol.setCellValueFactory(new PropertyValueFactory<>("key"));
            table.getColumns().add(keyCol);
    
            var valCol = new TableColumn<Pair<String, String>, String>("Value");
            valCol.setCellValueFactory(new PropertyValueFactory<>("value"));
            valCol.setCellFactory(tc -> new TableCell<>() {
                { getStyleClass().add("highlighted-table-cell"); }
                @Override protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty || item == null) {
                        setText(null);
                    } else {
                        setText(item);
                    }
                }
            });
            table.getColumns().add(valCol);
    
            var scene = new Scene(table, 600, 400);
            scene.getStylesheets().add("Main.css");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
    }
    

    Main.css

    .highlighted-table-cell {
        -fx-background-color: rgba(0, 128, 0, 0.3);
    }
    
    /* Needed by cell selection mode */
    .highlighted-table-cell:selected {
        -fx-background-color: inherit;
    }
    
    /* Needed by row selection mode */
    .table-row-cell:selected > .highlighted-table-cell {
        -fx-background-color: inherit;
    }
    

    【讨论】:

      【解决方案2】:

      类似

      table.getSelectionModel().setCellSelectionEnabled(true);
      
      .table-cell:selected {
          -fx-background-color: white;
          -fx-text-fill: black;
      }
      

      应该有效

      【讨论】:

      • 就是这样,我将不得不使用getStyleClass.add("something.css") 而不是setStyle(String),因为你不能在代码中定位(或者至少它很乱)。
      • 这应该可以解决问题。显然将颜色更改为对您的应用程序有意义的颜色。
      【解决方案3】:

      您可以通过订阅所选属性来切换TableCellupdateItem() 方法中的样式:

      String style = "-fx-background-color: rgba(0, 128, 0, 0.3);";
      setStyle(style);
      selectedProperty().addListener((observableValue, value, old) -> {
          if (value) {
              setStyle(style);
          } else {
              setStyle(null);
          }
      });
      

      或者使用 CSS 文件:

      .table-cell {
          -fx-background-color: rgba(0, 128, 0, 0.3);
      }
      
      .table-cell:selected {
          -fx-background-color: inherit;
      }
      

      这将为表格中的所有单元格着色。如果您只想为单个列着色,我建议您为此使用自定义类:

      getStyleClass().add("customhighlight");
      

      以这种方式修改 CSS 文件:

      .table-cell.customhighlight {
          -fx-background-color: rgba(0, 128, 0, 0.3);
      }
      
      .table-cell.customhighlight:selected {
          -fx-background-color: inherit;
      }
      

      所有解决方案都使用所选单元格的默认选择样式,方法是重置背景颜色。结果如下所示:

      【讨论】:

      • 如何将css文件应用到一列?我知道现在可以做到这一点table.getStyleClass().add("customhighlight"); 它会更改整个表格,但是您如何只影响一列?我在一个专栏上试过了,没有用。
      • @trilogy 如果使用getStyleClass().add("customhighlight"); 将类添加到表格单元格,则必须删除两个css 类之间的空格,因为它们位于同一元素上:.customhighlight.table-cell。或者您只需将.table-cell 替换为.customhighlight
      猜你喜欢
      • 2018-03-04
      • 2021-07-11
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多