Как добавить значение для элементов в ComboBox в JavaFX

Как я могу добавить значение для элементов в поле со списком, чтобы, когда пользователь выбирает элемент изComboBox Я могу отобразить цену за этот товар

Например. если пользователь выбирает животное, я могу отобразить цену этого животного. Пользователь выбираетdog тогда я могу отобразить цену$45.

public class comboBox extends Application {

    Stage window;
    Scene scene;
    Button button;
    ComboBox<String> comboBox;

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        window = primaryStage;
        window.setTitle("ComboBox");
        button = new Button("Submit");

        comboBox = new ComboBox<>();
        comboBox.getItems().addAll(
            "cat",
            "dog",
            "bird"
        );

        comboBox.setPromptText("Please select one");
        button.setOnAction(e -> printPrice());

        VBox layout = new VBox(10);
        layout.setPadding(new Insets(60, 60, 60, 60));
        layout.getChildren().addAll(comboBox, button);

        scene = new Scene(layout, 450, 350);
        window.setScene(scene);
        window.show();
    }

    private void printPrice(){
        System.out.println(comboBox.getValue());
    }
}

Я пытался исправить код, и это то, что я получил, все еще есть несколько ошибок, кто-нибудь знает, что я делаю неправильно?

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.collections.FXCollections;

public class animals extends Application {

Stage window;
Scene scene;
Button button;
ComboBox<String> comboBox;




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

@Override
public void start(Stage primaryStage) throws Exception {
    window = primaryStage;
    window.setTitle("ComboBox ");
    button = new Button("Submit");

    comboBox.setConverter(new StringConverter<Animal>() {
@Override
public String toString(Animal object) {
    return object.getName();
}

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


ComboBox<Animal> comboBox = new ComboBox<Animal>();
comboBox.setItems(FXCollections.observableArrayList(new Animal("Dog", 30.12),  new Animal("Cat", 23.23), new Animal("Bird", 15.0)));

comboBox.valueProperty().addListener((obs, oldVal, newVal) ->  System.out.println("Price of the " + newVal.getName() + " is : "  +  newVal.getPrice()));    }

VBox layout = new VBox(10);
    layout.setPadding(new Insets(60, 60, 60, 60));
    layout.getChildren().addAll(comboBox, button);

    scene = new Scene(layout, 500, 350);
    window.setScene(scene);
    window.show();

}

public class Animal {
private String name;
private Double price;

public Double getPrice() {
    return price;
}

public String getName() {
    return name;
}

public Animal(String name, Double price) {
    this.name = name;
    this.price = price;

}
}

Кроме того, как я могу отображать цену в поле со списком после того, как пользователь выбирает животное? так что будет сказано «цена за это животное»

Ответы на вопрос(1)

Вы должны предоставить модель данных дляComboBox который хранит имя и цену животного, например, экземпляры классаAnimal.

public class Animal {
    private String name;
    private Double price;

    public Double getPrice() {
        return price;
    }

    public String getName() {
        return name;
    }

    public Animal(String name, Double price) {
        this.name = name;
        this.price = price;
    }
}

Тогда в вашемComboBox вы можете отобразить этиAnimal экземпляры:

ComboBox<Animal> comboBox = new ComboBox<Animal>();
comboBox.setItems(FXCollections.observableArrayList(
    new Animal("Dog", 30.12),
    new Animal("Cat", 23.23), 
    new Animal("Bird", 15.0)));

comboBox.valueProperty().addListener((obs, oldVal, newVal) -> 
    System.out.println("Price of the " + newVal.getName() + " is : " + newVal.getPrice()));

Осталось только отобразить название животных наComboBox а не сами объекты. Чтобы достичь этого, вы можете использовать, например,StringConverter:

comboBox.setConverter(new StringConverter<Animal>() {
    @Override
    public String toString(Animal object) {
        return object.getName();
    }

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

При изменении значения вывод выглядит так:

Price of the Cat is : 23.23
Price of the Dog is : 30.12
Price of the Bird is : 15.0

MCVE:

public class Animals extends Application {
    private ComboBox<Animal> comboBox = new ComboBox<>();
    private Text textNamePrice = new Text();

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

    @Override
    public void start(Stage primaryStage) throws Exception {

        comboBox.setConverter(new StringConverter<Animal>() {
            @Override
            public String toString(Animal object) {
                return object.getName();
            }

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

        comboBox.setItems(FXCollections.observableArrayList(new Animal("Dog", 30.12),
                new Animal("Cat", 23.23),
                new Animal("Bird", 15.0)));

        comboBox.valueProperty().addListener((obs, oldVal, newVal) -> {
            String selectionText = "Price of the " + newVal.getName() + " is : " + newVal.getPrice();

            System.out.println(selectionText);
            textNamePrice.setText(selectionText);
        });

        VBox layout = new VBox(10);
        layout.setPadding(new Insets(60, 60, 60, 60));
        layout.getChildren().addAll(comboBox, textNamePrice);

        Scene scene = new Scene(layout, 500, 350);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public class Animal {
        private String name;
        private Double price;

        public Double getPrice() { return price; }

        public String getName() { return name; }

        public Animal(String name, Double price) {
            this.name = name;
            this.price = price;
        }
    }
}
 DVarga19 июл. 2016 г., 14:39
Это на самом деле тот же вопрос, просто показатьFood объекты, а неAnimal объекты.
 DVarga20 июл. 2016 г., 12:32
Вы должны сделать то же самое, но с объектами Food, у вас есть полный шаблон. Если вы застряли, пожалуйста, задайте отдельный вопрос, который включает ваш полный код, и ошибки, которые вы получаете, и описание целира, чего вы хотите достичь, тогда вы получите помощь, я полностью уверен.
 user658784115 июл. 2016 г., 07:22
У меня есть одна ошибка сейчас animals.java:52: error: класс Animal общедоступен, должен быть объявлен в файле с именем Animal.javapublic class Animal {
 DVarga15 июл. 2016 г., 07:11
да, вы должны импортироватьjavafx.collections.FXCollections.
 user658784116 июл. 2016 г., 06:28
я сделал это право, чтобы отобразить право отображать имя и стоимость под раскрывающимся спискомText t = new Text("Price of the " + newVal.getName() + " is : " + newVal.getPrice()); как показывает noughting
 user658784115 июл. 2016 г., 07:06
Спасибо, мне нужно импортировать что-либо для FXCollections, так как я получаю эту ошибку Не удается найти символ: FXCollections
 DVarga15 июл. 2016 г., 07:24
Затем сделайте то, что предлагает ошибка, создайте файл Animal.java и скопируйте класс :)
 user658784119 июл. 2016 г., 14:13
спасибо также, как бы я добавил еще одно поле со списком в поле со списком животных для продуктов, которые будут делать то же самое и отображать цену выбранного продукта
 DVarga15 июл. 2016 г., 12:17
добавил полный пример для вас.
 DVarga16 июл. 2016 г., 09:45
Обновленный полный пример для вас с текстом также.

Ваш ответ на вопрос