java - 如果 ChangeListener 检测到更改,则更改 ComboBox 样式
问题描述
我继承了一些我试图通过根据检测到的 ComboBox 值更改更改 ComboBox 的边框颜色来扩展的代码。但是,似乎对 ComboBox 样式所做的任何更改都不会使其超出 ChangeListener lambda。
基本上,ComboBox 边框初始化为黑色,我想在用户更改值后更改为颜色,但不会应用 ChangeListener 内设置的颜色。当我单步执行代码时,我看到 lambda ChangeListener 内部的样式字符串发生了变化,但是当我退出 lambda ChangeListener 时,它又回到了初始样式字符串。
我在下面包含了我正在修改的代码,我尝试添加的代码设置了插入和调用的 ComboBox 样式。任何帮助,将不胜感激。
public class SearchScreenController
{
@FXML
private TableView<ConfigBaselineFileArtifact> searchRecordsTable;
@FXML
private TableColumn<ConfigBaselineFileArtifact, String> categoryColumn = new TableColumn<>("File Category");
@FXML
private TableColumn<ConfigBaselineFileArtifact, ConfigBaselineFileArtifact> subcategoryColumn = new TableColumn<>("File Subcategory")
private void createSearchTable()
{
searchRecordsTable.getColumns().clear();
//File Category and Subcategory Columns
categoryColumn.setCellValueFactory(new PropertyValueFactory<>("fileCategoryName"));
subcategoryColumn.setCellValueFactory(value -> new SimpleObjectProperty(value.getValue()));
categoryColumn.setCellFactory(param -> new TableCell<ConfigBaselineFileArtifact, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (!empty) {
ComboBox<String> cb = new ComboBox<String>(FXCollections.observableArrayList(categoryList));
cb.setValue(item);
cb.setPrefWidth(145);
cb.setStyle("-fx-background-color: transparent; -fx-border-color: black;");
cb.getSelectionModel().selectedItemProperty().addListener((ChangeListener<String>) (observable, oldValue, newValue) -> {
if (newValue != null) {
int index = getIndex();
// Test for case that updated combobox isn't listed with list of selected records
if (!searchRecordsTable.getSelectionModel().getSelectedIndices().contains(index)) {
searchRecordsTable.getItems().get(index).setFileCategoryName(newValue);
searchRecordsTable.getItems().get(index).setFileSubCategoryName("");
DataStore.getInstance().saveConfigBaselineFileArtifact(searchRecordsTable.getItems().get(index));
} else {
// Else if updated combobox IS within list of selected records
searchRecordsTable.getSelectionModel().getSelectedItems().forEach(record -> {
record.setFileCategoryName(newValue);
record.setFileSubCategoryName("");
DataStore.getInstance().saveConfigBaselineFileArtifact(record);
});
}
// Code I'm trying to add is below
if (newValue.equals("")) {
cb.setStyle("-fx-background-color: transparent; -fx-border-color: red;");
} else {
cb.setStyle("-fx-background-color: transparent; -fx-border-color: green;");
// Code I'm trying to add is above
searchRecordsTable.refresh();
}
});
setGraphic(cb);
}
}
});
searchRecordsTable.getColumns().addAll(checkBoxColumn, fileNameColumn, artifactNameColumn, categoryColumn, subcategoryColumn, sensorNameColumn, subsystemColumn, componentColumn, dateImportedColumn, importedByColumn, labelsColumn);
searchRecordsTable.refresh();
searchRecordsTable.setEditable(true);
searchRecordsTable.getSelectionModel().getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
}
}
解决方案
我认为问题在于,边界正在您的searchRecordsTable.refresh();
通话中重置。似乎updateItem(String item, boolean empty)
再次调用了该函数。您需要确保将状态存储在其他任何地方,例如 HashMap。像这样的东西:
private Map<String, Boolean> changeMap = new HashMap<>();
//in your selectedItem listener
if (newValue.equals("")) {
changeMap.remove(item);
} else {
changeMap.put(item, true);
}
//before setGraphic(cb)
if(changeMap.contains(item)) {
cb.setStyle("-fx-background-color: transparent; -fx-border-color: green;");
}
推荐阅读
- c - 我找到阶乘的 C 程序没有给我想要的结果
- c - C中的类型转换是香蕉?
- gradle - 在 Gradle 中,可以从 Groovy 方法中获取调用项目或任务吗?
- python - 未定义的变量“资源”
- c# - 阻止对特定域 CefSharp 的请求
- reactjs - 使用 rowEvents react-bootstrap-table 修改一行单元格的样式
- openiddict - 除了使用 OpenIddict 的 OpenId 之外,还允许 Basic 授权
- sas - 在 SAS Enterprise Guide 8.1 上打开 SAS 表后文件树消失
- javascript - 如何在 postgresql & express 中的其他占位符变量中插入日期范围?
- ubuntu - “无法初始化 NVML:驱动程序/库版本不匹配”- Ubuntu 服务器是否自动更新?