将arraylist添加到我的javafx程序中的choicebox

将arraylist添加到我的javafx程序中的choicebox,java,javafx,arraylist,Java,Javafx,Arraylist,所以我一直在尝试将我的arraylist转移到我在JavaFX类中创建的choicebox。但是,我在加载项目名称时遇到了一些问题。我创建了一个名为Item的独立类,其中包含我创建的构造函数,并创建了一个返回Item名称的方法。但是,我希望将项目属性传输到我的choicebox,但只显示项目名称 public class Item { private final String name, description; private boolean spoiled, buyabl

所以我一直在尝试将我的arraylist转移到我在JavaFX类中创建的choicebox。但是,我在加载项目名称时遇到了一些问题。我创建了一个名为Item的独立类,其中包含我创建的构造函数,并创建了一个返回Item名称的方法。但是,我希望将项目属性传输到我的choicebox,但只显示项目名称

public class Item {


    private final String name, description;
    private boolean spoiled, buyable;
    private final int price, nutrition;
    private final boolean isFood;

    private double hoursToRot = 15;

    public Item() {
        this.name = null;
        this.description = null;
        this.price = 0;
        this.nutrition = 0;
        this.isFood = false;
    }
    public Item(String name, String description, int price, boolean buyable, boolean isFood, int nutrition)
    {

       this.description = description;
       this.name = name;      
       this.price = price;
       this.buyable = buyable;
       this.isFood = isFood;
       this.nutrition = nutrition;

    }
    public String getName()
    {
        return name;
    }
...
如您所见,这是我的item类

public class Game 
{
    Item item = new Item();
       public ArrayList<Item> supermarkedItems = new ArrayList();     
     public void supermarkedItems() {


        Item meat, milk, cake, rice, ryebread;

        milk = new Item("milk", "This is milk!", 14, true, true, 20);
        meat = new Item("meat", "This is meat!", 35, true, true, 30);
        cake = new Item("cake", "This is a whole cake!", 60, true, true, 50);
        rice = new Item("rice", "This is 500g of white rice!", 25, true, true, 50);
        ryebread = new Item("ryebread", "This is a loaf of ryebread", 25, true, true, 25);

        supermarkedItems.add(meat);
        supermarkedItems.add(milk);
        supermarkedItems.add(cake);
        supermarkedItems.add(rice);
        supermarkedItems.add(ryebread);



     }

     public ArrayList<Item> getsupermarkedList() {
         return supermarkedItems;
     }
     public String getItemNames () {
         return item.getName();
     }
...
公共类游戏
{
项目=新项目();
public ArrayList supermarkedItems=new ArrayList();
公开无效的超级市场(){
肉类、牛奶、蛋糕、大米、黑麦;
牛奶=新物品(“牛奶”,“这是牛奶!”,14,对,对,20);
肉=新项目(“肉”,“这是肉!”,35,对,对,30);
蛋糕=新项目(“蛋糕”,“这是一个完整的蛋糕!”,60,对,对,50);
大米=新产品(“大米”,“这是500克白米!”,25,对,对,50);
Ryebrad=新项目(“Ryebrad”,“这是一块Ryebrad面包”,25,真,真,25);
超级市场。添加(肉);
超级市场。添加(牛奶);
超级市场。添加(蛋糕);
超级市场。添加(大米);
超级市场。添加(ryebread);
}
公共阵列列表getsupermarkedList(){
回归超级市场;
}
公共字符串getItemName(){
return item.getName();
}
...
这是我的游戏课。 在我的javafx程序中,我创建了一个singleton类来将我的东西传输到javafx类

public class OrderTableController implements Initializable {

    Game g1 = Game.getInstance();
    @FXML
    private ChoiceBox<Item> cbItems = new ChoiceBox<Item>(FXCollections.observableArrayList(g1.getsupermarkedList())); 
    @Override
    public void initialize(URL url, ResourceBundle rb) {

        cbItems.getItems().addAll(g1.getItemNames());


...
公共类OrderTableController实现可初始化{
Game g1=Game.getInstance();
@FXML
private ChoiceBox cbItems=new ChoiceBox(FXCollections.observearraylist(g1.getsupermarkedList());
@凌驾
公共void初始化(URL、ResourceBundle rb){
cbItems.getItems().addAll(g1.getItemNames());
...
但是由于某些原因,我真的无法将我的项目转移到我在choicebox类中创建的新observableArrayList。

您遇到了一个错误,因为您试图将
字符串类型的对象添加到应该包含
项类型的列表中。您只能添加属于或扩展类
项的对象

要选择对象在
选择框中显示的文本,您需要在类中覆盖
toString()

您可以将其添加到项目类中,以在选项框中显示名称:

@Override
public String toString() {
    return name;
}
您可以通过执行以下操作将项目添加到ChoiceBox:

cbItems.getItems().addAll( g1.getsupermarkedList() );