JavaFx: ComboBox Dynami c изменение текста - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь обновить текст в выпадающем списке при изменении элемента без повторной инициализации элемента или элемента.

Есть ли способ привязать текст элемента к отображаемому тексту? Даже если я использую Property, кажется, что StringConverter игнорирует его, что понятно, но мне интересно, есть ли способ сделать привязку без повторной инициализации элемента. Вот сольион повторной инициализации: JavaFx: текст редактора ComboBox , которого я хочу избежать.

Вот простой код, который вы можете проверить:

public class MainStageController implements Initializable {

    @FXML
    private ComboBox<Hero> comboBox;
    @FXML
    private Button lvlUp;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        comboBox.setConverter(new StringConverter<Hero>() {
            @Override
            public String toString(Hero hero) {
                return hero.getName() + " - Level: " +  hero.getLevel();
            }

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

        lvlUp.setOnAction(event -> {
            Hero value = comboBox.getValue();
            value.levelProperty().setValue(value.getLevel() + 1);
        });

        Hero weakHero = new Hero("Ted", 1);
        Hero averageHero = new Hero("Zed", 10);
        Hero strongHero = new Hero("Med", 25);



        lvlUp.disableProperty().bind(comboBox.valueProperty().isNull());
        comboBox.setItems(FXCollections.observableArrayList(weakHero, averageHero, strongHero));
    }

    private static class Hero {

        private String name;
        private IntegerProperty level;

        public Hero(String name, Integer level) {
            this.name = name;
            this.level = new SimpleIntegerProperty(level);
        }

        private String getName() {
            return name;
        }

        private int getLevel() {
            return level.get();
        }

        public IntegerProperty levelProperty() {
            return level;
        }
    }
}

Что Я хочу: Когда я нажимаю Уровень вверх , обновите текст как в отображаемом тексте, так и в раскрывающемся списке.

enter image description here enter image description here

Возможно ли это?

1 Ответ

1 голос
/ 06 февраля 2020

Я объяснил, как использовать экстрактор. Использование StringConverter, нет слушателей .... Я использую JavaFX 8 ...

 public class UpdateableComboBox extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        ObservableList<Hero> heros 
        = FXCollections.observableArrayList((Hero param) -> new Observable[] { param.nameProperty(), param.levelProperty() });
        heros.add(new Hero("Ted", 1));
        heros.add(new Hero("Zed", 10));
        heros.add(new Hero("Med", 25));

        ComboBox<Hero> comboBox = new ComboBox<>();
        comboBox.setPrefWidth(350);
        comboBox.setItems(heros);
        Button button = new Button("Level Up");
        button.setOnAction(e -> {
             Hero value = comboBox.getValue();
             value.levelProperty().setValue(value.getLevel() + 1);
        });

        comboBox.setConverter(new StringConverter<Hero>() {
            @Override
            public String toString(Hero hero) {
                return hero.getName() + " - Level: " +  hero.getLevel();
            }

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

        HBox hbox = new HBox(comboBox, button);
        Scene scene = new Scene(hbox, 500, 100);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

    }

    private  class Hero {
        private StringProperty name = new SimpleStringProperty();
        private IntegerProperty level = new SimpleIntegerProperty();
        Hero(String name, int level){
            this.name.set(name);
            this.level.set(level);
        }
        public final StringProperty nameProperty() {
            return this.name;
        }

        public final String getName() {
            return this.nameProperty().get();
        }

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

        public final IntegerProperty levelProperty() {
            return this.level;
        }

        public final int getLevel() {
            return this.levelProperty().get();
        }

        public final void setLevel(final int level) {
            this.levelProperty().set(level);
        }

    }

}
...