У меня есть следующий код, где на основе значения переменной я меняю цвет шрифта столбца на красный.
public class TableViewExample extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
TableView tableView = new TableView();
tableView.getStylesheets().add(TableViewExample.class.getResource("TableEditor.css").toExternalForm());
TableColumn<Person, String> column1 = new TableColumn<>("First Name");
column1.setCellValueFactory(new PropertyValueFactory<>("firstName"));
TableColumn<Person, String> column2 = new TableColumn<>("Last Name");
column2.setCellValueFactory(new PropertyValueFactory<>("lastName"));
column2.setCellFactory((TableColumn<Person, String> param) -> {
TableCell<Person, String> cell = new TableCell<Person, String>() {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (!empty && getTableRow() != null && getTableRow().getItem() != null) {
if (((Person) getTableRow().getItem()).isShowRed()) {
setTextFill(Color.RED);
} else {
setTextFill(Color.BLACK);
}
setText(item);
}
}
};
return cell;
});
tableView.getColumns().add(column1);
tableView.getColumns().add(column2);
tableView.getItems().add(new Person("John", "Doe", false));
tableView.getItems().add(new Person("Jane", "Deer", true));
tableView.getItems().add(new Person("John", "Doe", false));
tableView.getItems().add(new Person("Jane", "Deer", true));
tableView.getItems().add(new Person("John", "Doe", false));
tableView.getItems().add(new Person("Jane", "Deer", true));
VBox vbox = new VBox(tableView);
Scene scene = new Scene(vbox);
primaryStage.setScene(scene);
primaryStage.show();
}
public class Person {
private String firstName = null;
private String lastName = null;
private boolean showRed = false;
public Person() {
}
public Person(String firstName, String lastName, boolean red) {
this.firstName = firstName;
this.lastName = lastName;
this.showRed = red;
}
public boolean isShowRed() {
return showRed;
}
public void setShowRed(boolean showRed) {
this.showRed = showRed;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
}
TableEditor.css
.table-view:focused .table-row-cell:filled:focused:selected {
-fx-background-color: blue;
-fx-text-fill: yellow;
}
/* Row hovered */
.table-view .table-row-cell:filled:hover {
-fx-background-color: blue;
-fx-text-background-color: yellow;
}
Проблема в том, что если я делаю setTextFill
для column2
, цвета шрифта hover и Selection из css не работают только для column2
.<9994731>128010>.
Я понимаю это из-за приоритета встроенных стилей.
Но как это преодолеть, ячейка столбца должна быть красного цвета, при наведении и выборе она должна брать цвет из css.
Почему бы не сделать все в таблице стилей? Почему вызовы
setTextFill
в коде?Связано: Как установить цвет фона ячейки (JavaFX, tableview), а также Образец выделения строки JavaFX TableView с использованием apis и css строки таблицы.