JavaFX:使用自定义样式表将文本颜色应用于TableCell?

JavaFX:如何使用自定义样式表将文本颜色应用于TableCell?

当我直接在我的CellFactory中使用setTextFill()时,它工作正常,但我想使用外部CSS文件应用自定义样式.我可以证明我的CSS类已应用,因为字体变为粗体.但是,不应用CSS文件的字体颜色.

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

    if (null != item) {        
        // EITHER:
        this.getStyleClass().add("styleImportant"); // Does NOT set color.

        // OR:
        this.setTextFill(Color.RED); // Does set color.
    }
    else {
        this.getStyleClass().remove("styleImportant");
    }

}

样式表:

.styleImportant {
    -fx-font-weight: bold; /** Does work. */
    -fx-text-fill: red; /** Does NOT work. */
}

它在某种程度上与CSS选择器的特异性有关,但我没有找到任何有效的设置.

编辑:我设法使用CSS同时应用自定义文本颜色和背景颜色.我的实现现在使用包裹在VBox中的Label来使背景颜色填充整个表格单元格.但是,在删除自定义样式时,仍然存在一些未清除背景颜色的问题.

有没有比应用清晰风格更好的解决方案?

colExample.setCellFactory(new Callback<TableColumn<Example, Example>, TableCell<Example, Example>>() {
  @Override
  public TableCell<Example, Example> call(TableColumn<Example, Example> tableColumn) {
     return new TableCell<Example, Example>() {
        private VBox container;
        private Label text;

        // Anonymous constructor
        {
           this.container = new VBox();
           this.text = this.createLabel();

           this.container.getChildren().add(this.text);
           this.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
           this.setStyle("-fx-padding: -1 -1 -1 -1;"); // Remove padding from cell

           this.setGraphic(this.container);
        }

        private final Label createLabel() {
           Label label = new Label();

           VBox.setVgrow(label, Priority.ALWAYS);
           label.setMaxWidth(Double.MAX_VALUE);
           label.setMaxHeight(Double.MAX_VALUE);
           label.setAlignment(Pos.CENTER);

           return label;
        }

        @Override
        protected void updateItem(Example example, boolean empty) {
           super.updateItem(example, empty);

           // Reset column styles
           if (null != this.text && null != this.text.getStyleClass()) {
              String[] possibleStyles = new String[] { "styleImportant", "clearStyle" };

              for (String style: possibleStyles) {
                 if (this.text.getStyleClass().contains(style)) {
                    // Will not reset background, even though style is removed?
                    this.text.getStyleClass().remove(style);
                 }
              }

              // Apply reset style to clear background color
              this.text.getStyleClass().add("clearStyle");
           }

           if (null != example) {
              this.text.setText(example.getContent());

              if (example.isImportant()) {
                 this.text.getStyleClass().add("styleImportant");
              }
           }
        }
     };
  }
});

我的样式表:

/** Keep black text color, when user selects row */
.table-row-cell:focused {
   -fx-dark-text-color: #000000;
   -fx-mid-text-color: #000000;
   -fx-light-text-color: #000000;
}

/** Style to reset background color */
.clearStyle {
   -fx-background-color: transparent;
}

/** Style for important cells */
.styleImportant {
   /** Red text color on any background */
   -fx-dark-text-color: #FF0000;
   -fx-mid-text-color: #FF0000;
   -fx-light-text-color: #FF0000;

   -fx-background-color: #FF9999;
}
最佳答案
正如José在他的回答中指出的那样,如果你在单元格中设置图形,你(可能)需要将css样式类应用于图形(取决于图形是什么).如果您只是调用setText(…),您的代码应该可以工作.

设置为图形的Label不会从表格单元格继承-fx-text-fill的原因是Label还具有-fx-text-fill的设置.在默认样式表中,TableCell和Label都具有以下设置:

-fx-text-fill: -fx-text-background-color ;

fx-text-background-color是一个定义为梯形图的looked-up color,如下所示:

-fx-text-background-color: ladder(
    -fx-background,
    -fx-light-text-color 45%,
    -fx-dark-text-color  46%,
    -fx-dark-text-color  59%,
    -fx-mid-text-color   60%
);

这个(相当复杂的)设置意味着-fx-text-background-color的值取决于-fx-background的值.如果-fx-background小于最大强度的45%(即它是暗的),则-fx-text-background-color的值设置为-fx-light-text-color.如果-fx-background的强度介于46%和59%之间,则该值等于-fx-drak-text-color.如果它是60%或更多,则设置为-fx-mid-text-color.这里的想法是文本颜色将自动调整为背景以保持可见. -fx-dark-text-color,-fx-mid-text-color和-fx-light-text-color的值分别设置为黑色,深灰色(#333)和白色.

由于Label不会覆盖-fx-text-background-color的值,因此只需更改表格单元格的值即可实现所需:

.styleImportant {
    -fx-text-background-color: red ;
}

现在,这将覆盖表格单元格的查找颜色值,并且由于单元格内的图形本身不会覆盖该值,因此它会从单元格继承该值.

更复杂的方法是重新定义-fx- [light | mid | dark] -text-colors.这样做的好处是,如果更改背景,颜色将适当调整:特别是如果选择了单元格,则可以确保文本保持可见:

.styleImportant {
    -fx-light-text-color: white ;
    -fx-mid-text-color:   #c00 ;
    -fx-dark-text-color:  red ;
}

转载注明原文:JavaFX:使用自定义样式表将文本颜色应用于TableCell? - 代码日志