Изменить стиль ComboBox, если ChangeListener обнаруживает изменение - PullRequest
0 голосов
/ 06 июля 2018

Я унаследовал некоторый код, который я пытаюсь расширить, изменив цвет границы ComboBox на основе обнаруженного изменения значения ComboBox. Однако, похоже, что любые изменения, внесенные в стиль ComboBox, не делают его вне лямбды ChangeListener.

По сути, граница ComboBox инициализируется черным, и я хочу изменить цвет после того, как пользователь изменит значение, но цвет, установленный внутри ChangeListener, не применяется. Когда я шагаю по коду, я вижу изменение строки стиля внутри лямбда-элемента ChangeListener, но оно возвращается к исходной строке стиля при выходе из лямбда-номера 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);
    }
}

1 Ответ

0 голосов
/ 07 июля 2018

Я думаю, проблема в том, что граница сбрасывается при вашем вызове 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;");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...