我进行了更改:
Change TableColumn background in TableView, whilst retaining alternating row colour?
未选中看起来不错:
但是,当您选择一个单元格时:
看起来像这样,但是我希望它在被选中/集中时能够正常工作。
我很确定我需要使用样式类,但是,我不知道仅使用不同的颜色背景来保留TableCell
的所有其他功能所需要的属性是什么。另外,我是否在单元级别或列级别应用样式类?
更新
我的CSS文件: custom.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");
它什么也没做。
我也在单元格级别上尝试过...
答案 0 :(得分:2)
如果我对您的理解正确,那么您想要:
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;
}
答案 1 :(得分:1)
类似
table.getSelectionModel().setCellSelectionEnabled(true);
.table-cell:selected {
-fx-background-color: white;
-fx-text-fill: black;
}
应该工作
答案 2 :(得分:1)
您可以通过订阅选定的属性,在updateItem()
的{{1}}方法中切换样式:
TableCell
或通过使用CSS文件:
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);
}
});
这将为表格中的所有单元格着色。如果您只想为单个列着色,我建议为此使用自定义类:
.table-cell {
-fx-background-color: rgba(0, 128, 0, 0.3);
}
.table-cell:selected {
-fx-background-color: inherit;
}
以这种方式修改CSS文件:
getStyleClass().add("customhighlight");
所有解决方案都通过重置背景色来为所选单元格使用默认选择样式。结果看起来像这样: