Java 如果ChangeListener检测到更改,则更改组合框样式

Java 如果ChangeListener检测到更改,则更改组合框样式,java,javafx,combobox,changelistener,Java,Javafx,Combobox,Changelistener,我继承了一些代码,试图通过根据检测到的ComboBox值更改更改ComboBox的边框颜色来扩展这些代码。但是,似乎对组合框样式所做的任何更改都不会使其超出ChangeListener lambda 基本上,组合框边框被初始化为黑色,我想在用户更改值后更改为颜色,但是ChangeListener中的颜色集没有得到应用。当我逐步浏览代码时,我看到lambda ChangeListener中的样式字符串发生了更改,但当我退出lambda ChangeListener时,它会返回到初始样式字符串 我在

我继承了一些代码,试图通过根据检测到的ComboBox值更改更改ComboBox的边框颜色来扩展这些代码。但是,似乎对组合框样式所做的任何更改都不会使其超出ChangeListener lambda

基本上,组合框边框被初始化为黑色,我想在用户更改值后更改为颜色,但是ChangeListener中的颜色集没有得到应用。当我逐步浏览代码时,我看到lambda ChangeListener中的样式字符串发生了更改,但当我退出lambda ChangeListener时,它会返回到初始样式字符串

我在下面包含了我正在修改的代码,以及我试图添加的代码,设置插入并调用的组合框样式。任何帮助都将不胜感激

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);
    }
}
公共类SearchScreenController
{
@FXML
私有TableView搜索记录稳定;
@FXML
private TableColumn categoryColumn=新的TableColumn(“文件类别”);
@FXML
私有TableColumn子类别Column=新TableColumn(“文件子类别”)
私有void createSearchTable()
{
searchRecordsTable.getColumns().clear();
//文件类别和子类别列
categoryColumn.setCellValueFactory(新的PropertyValueFactory(“fileCategoryName”);
subcategory column.setCellValueFactory(值->新建SimpleObject属性(value.getValue());
categoryColumn.setCellFactory(参数->新建表格单元格(){
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
如果(!空){
ComboBox cb=新的ComboBox(FXCollections.observableArrayList(categoryList));
cb.设定值(项目);
cb.setPrefWidth(145);
cb.setStyle(“-fx背景颜色:透明;-fx边框颜色:黑色;”);
cb.getSelectionModel().SelectEditeProperty().addListener((ChangeListener)(可观察、旧值、新值)->{
if(newValue!=null){
int index=getIndex();
//测试更新的组合框未与所选记录列表一起列出的情况
如果(!searchRecordsTable.getSelectionModel().getSelectedIndices().contains(索引)){
searchRecordsTable.getItems().get(索引).setFileCategoryName(新值);
searchRecordsTable.getItems().get(索引).setFileSubCategoryName(“”);
DataStore.getInstance().saveConfigBaselineFileArtifact(searchRecordsTable.getItems().get(index));
}否则{
//否则,如果更新的组合框在所选记录列表中
searchRecordsTable.getSelectionModel().getSelectedItems().forEach(记录->{
record.setFileCategoryName(newValue);
record.setFileSubCategoryName(“”);
DataStore.getInstance().saveConfigBaselineFileArtifact(记录);
});
}
//下面是我要添加的代码
if(newValue.equals(“”){
cb.setStyle(“-fx背景颜色:透明;-fx边框颜色:红色;”);
}否则{
cb.setStyle(“-fx背景颜色:透明;-fx边框颜色:绿色;”);
//我试图添加的代码在上面
searchRecordsTable.refresh();
}
});
设定图形(cb);
}
}
});
searchRecordsTable.getColumns().addAll(checkBoxColumn、fileNameColumn、artifactNameColumn、categoryColumn、SubCategory Column、sensorNameColumn、subsystemColumn、componentColumn、dateImportedColumn、importedByColumn、LabelColumn);
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;");
}
private Map changeMap=new HashMap();
//在selectedItem侦听器中
if(newValue.equals(“”){
更改映射。删除(项目);
}否则{
changeMap.put(项,true);
}
//设置图形前(cb)
if(changeMap.contains(项目)){
cb.setStyle(“-fx背景颜色:透明;-fx边框颜色:绿色;”);
}

如果不增加大小,边框也很难看到,因为默认情况下,
组合框
不使用边框,因此生成的边框只有1 px宽……而且当项目移动到另一个单元格时,这也不会恢复相同的外观。此外,单元格变空将使组合框保持为
图形lso每次替换项目时,您都在重新创建组合框。@fabian对不起,我不明白链接字符串比较问题与在中设置组合框样式有什么关系。也许您是在引用我如何使用
newValue==“”
而不是
newValue.equals(“”