Este é o meu código:
public class JavaFxTest7 extends Application {
private static class Student {
private int id;
private int mark;
public Student(int id, int mark) {
this.id = id;
this.mark = mark;
}
public int getId() {
return id;
}
public int getMark() {
return mark;
}
}
private TableView<Student> table = new TableView<>(FXCollections.observableList(
List.of(new Student(1, 3), new Student(2, 4), new Student(3, 5))));
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
var idColumn = new TableColumn<Student, Integer>();
idColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().getId()));
var markColumn = new TableColumn<Student, Integer>();
markColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().getMark()));
table.getColumns().addAll(idColumn, markColumn);
VBox root = new VBox(new TextField(), table);
var scene = new Scene(root, 400, 300);
var css= this.getClass().getResource("test7.css").toExternalForm();
scene.getStylesheets().addAll(css);
primaryStage.setScene(scene);
primaryStage.show();
}
}
E preciso definir o amarelo como cor de fundo para a linha da tabela selecionada, mas não em foco. E verde como cor de fundo para a linha da tabela em foco. Tentei :
.table-row-cell:selected:focused {
-fx-background-color: green;
-fx-background-insets: 0;
}
.table-row-cell:selected {
-fx-background-color: yellow;
-fx-background-insets: 0;
}
mas deu este resultado:
e este código:
.table-row-cell:focused {
-fx-background-color: green;
-fx-background-insets: 0;
}
.table-row-cell:selected {
-fx-background-color: yellow;
-fx-background-insets: 0;
}
deu este resultado:
Alguém poderia dizer como fazer isso?
As regras CSS para linhas e células selecionadas da tabela são bastante complicadas. Na folha de estilo padrão eles são definidos da seguinte forma:
Em poucas palavras,
fx-background-color
for rows é definido como uma cor pesquisada chamada-fx-background
(com uma borda que é implementada por um plano de fundo aninhado). O-fx-background-color
para as células individuais não selecionadas em uma linha é enviado paranull
, (transparente) para que você veja o plano de fundo da linha, e para as células individuais selecionadas é definido como-fx-background
.Quando a linha é selecionada e focada, a cor pesquisada
-fx-background
é definida para ambas as linhas e células individuais para outra cor pesquisada chamada-fx-selection-bar
, e quando a linha é selecionada, mas não focada,-fx-background
é definida, novamente para linhas e células, para-fx-selection-bar-non-focused
.Não consigo explicar o comportamento exato que você observa, mas a maneira mais simples de conseguir o que deseja é definir as cores pesquisadas usadas para seleção: