user6587841 user6587841 - 4 months ago 20
Java Question

How do I add a value to items in a ComboBox in JavaFX

How can I add a value to items in a combo box so when the user selects an item from the

ComboBox
I am able to display the price for that item

Eg. if the user selects an animal I can display the price of that animal. The
the user selects
dog
then I can display the price of
$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());
}
}


I have tried to fix the code and this is what I got there is still a few errors anyone know what I am doing wrong?

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;

}
}


also, I am new at javafx and still learning it

Answer

You should provide a data model to the ComboBox which stores the name and the price of the animal, for example instances of the class 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;
    }
}

Then in your ComboBox you can display these Animal instances:

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()));

The only thing left to display the name of the animals on the ComboBox rather than the objects itself. To achieve this, you can use for example a StringConverter:

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

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

On value change, the output is like:

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

A complete, runnable example (Animals.java)

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.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;
import javafx.collections.FXCollections;

public class Animals extends Application {

    Stage window;
    Scene scene;
    Button button;
    ComboBox<Animal> comboBox = new ComboBox<Animal>();

    static public TextField[] tfLetters = new TextField[37];

    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<Animal>();

        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) -> 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;
        }
    }
}
Comments