Элемент настройки в ChoiceBox добавляет новую строку вместо изменения существующей (используя Observable) - PullRequest
1 голос
/ 18 апреля 2019

С некоторых пор я пытаюсь изменить цвет строки в соответствии со значением свойства в FXCollections (после редактирования ячейки: true -> зеленая строка, false -> красная строка).В одном вопросе SO есть информация для использования Observable.Я до сих пор не знаю, как его использовать, и теперь я пытаюсь понять пост @ kleopatra.Я добавил 3 элемента в choiceBox, а затем, нажав кнопку, хотел бы изменить один из них.Каждый клик добавляет строку к choiceBox.Зачем?Мне нужно обновить это или что-то?Я начал отображать все элементы при каждом нажатии, и количество элементов остается прежним, даже этот элемент изменяется.Может кто-нибудь объяснить мне, как это правильно редактировать?

Main.java:

public class Main extends Application {

    public static int i = 0;

    @Override
        public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
        Parent root = loader.load();
        Controller controller = loader.getController();
        primaryStage.setTitle("Hello World");

        ObservableList<Test> items = FXCollections.observableArrayList(e -> new Observable[]{e.nameProperty()});
        Test test1 = new Test("test1");
        Test test2 = new Test("test2");
        Test test3 = new Test("test3");

        Button button = controller.getButton();
        button.setOnAction(e -> {
            test1.setName("name changed" + ++i);
        });

        items.addAll(test1, test2, test3);
        ChoiceBox choiceBox = controller.getChoiceBox();
        choiceBox.setItems(items);

        StringConverter<Test> converter = new StringConverter<Test>() {

            @Override
            public String toString(Test album) {
                return album != null ? album.getName() : null;
            }

            @Override
            public Test fromString(String string) {
                return null;
            }
        };

        choiceBox.setConverter(converter);

        Scene scene = new Scene(root, 300, 275);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

sample.fxml:

<GridPane fx:controller="sample.Controller"
      xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">

    <ChoiceBox fx:id="choiceBox" GridPane.columnIndex="0" GridPane.rowIndex="0"></ChoiceBox>

    <Button fx:id="button" GridPane.columnIndex="0" GridPane.rowIndex="1" text="CHANGE"></Button>
</GridPane>

Controller.java:

public class Controller {

    @FXML
    private ChoiceBox choiceBox;
    @FXML
    private Button button;

    public ChoiceBox getChoiceBox() {
        return choiceBox;
    }

    public void setChoiceBox(ChoiceBox choiceBox) {
        this.choiceBox = choiceBox;
    }

    public Button getButton() {
        return button;
    }

    public void setButton(Button button) {
        this.button = button;
    }
}

Test.java:

class Test {
    StringProperty name;

    public Test(String name) {
        setName(name);
    }

    public StringProperty nameProperty() {
        if (name == null) name = new SimpleStringProperty(this, "name");
        return name;
    }

    public void setName(String name) {
        nameProperty().set(name);
    }

    public String getName() {
        return nameProperty().get();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...