JAVAFx: приоритет стиля таблицы: изменить цвет наведения на TableCell

avatar
user3164187
9 августа 2021 в 05:34
96
0
0

У меня есть следующий код, где на основе значения переменной я меняю цвет шрифта столбца на красный.

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.

Источник
Slaw
9 августа 2021 в 06:21
4

Почему бы не сделать все в таблице стилей? Почему вызовы setTextFill в коде?

Ответы (0)