如何为 JavaFX 中的 ComboBox 中的项目添加值

Posted

技术标签:

【中文标题】如何为 JavaFX 中的 ComboBox 中的项目添加值【英文标题】:How do I add a value to items in a ComboBox in JavaFX 【发布时间】:2016-11-16 22:50:54 【问题描述】:

如何为组合框中的项目添加值,以便当用户从 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;



另外,在用户选择动物后,如何在组合框下方显示价格?所以它会说“动物成本的价格”

【问题讨论】:

请使用java命名约定 【参考方案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;
        
    

【讨论】:

谢谢我是否需要为 FXCollections 导入任何内容,因为我收到此错误找不到符号:FXCollections 是的,你应该导入javafx.collections.FXCollections 我现在有一个错误animals.java:52:错误:类Animal是公共的,应该在一个名为Animal.java public class Animal 的文件中声明 然后按照错误提示做,创建一个 Animal.java 文件并复制类:) 为您添加了完整的示例。

以上是关于如何为 JavaFX 中的 ComboBox 中的项目添加值的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像工具提示添加到 JavaFX 中的 ComboBox 项?

如何将 JavaFX ComboBox 中的选择转换为字符串

JavaFX:GridPane 中的 ComboBox 导致不必要的大小调整

如何为组合框和列表中的选项添加标签?

在 JavaFX 中隐藏表格

将项添加到comboBox javaFx FXML时出错[重复]