意外的令牌 - 为什么会发生以及如何消除错误

问题描述 投票:0回答:1

我使用 javafx 和场景生成器制作了一个 GUI。我当前的任务是从类中调用信息,以便我可以在我的 GUI 中显示它。我在一个数组中初始化了 3 个对象,现在我尝试使用 for 循环创建这些对象。但是,当我编写 for 循环时,出现“意外标记”错误。我没有看到任何红线或语法错误。

这是我的代码(粗体字是发生错误的地方):

package com.example.moonbucksgui4;

import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class GUIController {
    @FXML
    private Label drinkText;
    @FXML
    private Label mugText;
    @FXML
    private Label gcText;

    private Drinks[] drinksMenu = new Drinks[3];
    private String[] names = {"Cappuccino", "Latte", "Hot Chocolate"};

    /* Drink Info */
    private int[] calories = {60,130,320};
    private String[] sizes = {"Tall","Grande","Venti"};
    private double[] fat = {0.1, 0.3, 3.0};
    private int[] sugar = {8,18,55};
    private double[] price = {5.99, 10.99, 15.35};

    /* Drink Classes */
    for(int i=0; i < drinksMenu.length; i++)


    @FXML
    protected void drinkButtonClick(){
        drinkText.setText("These are Drinks");
        mugText.setText("");
        gcText.setText("");
    }
    @FXML
    protected void mugButtonClick(){
        mugText.setText("These are mugs");
        drinkText.setText("");
        gcText.setText("");
    }
    @FXML
    protected void gcButtonClick(){
        gcText.setText("These are Gift Cards");
        drinkText.setText("");
        mugText.setText("");
    }
}

user-interface javafx controller scenebuilder intellij-14
1个回答
0
投票

正如 SedJ601 所指出的,初始化控制器中字段的指令,请使用

initialize()
方法:

public void initialize() {
    for (int i=0; i < drinksMenu.length; i++) {
        drinksMenu[i] = new Drinks(names[i], calories[i], sizes[i], fat[i], sugar[i], price[i]);
    }
}

但是,在您的示例中,饮料本身是数据,因此可能根本不应该在控制器中初始化,但

drinksMenu
应该在应用程序的其他位置创建并传递到控制器

对于像示例中这样的少量硬编码数据,您可以内联初始化它,而无需像这样的循环:

record Drink(
        String name,
        int calories,
        String size,
        double fat,
        int sugar,
        BigDecimal price
) {}

private final List<Drink> drinks = List.of(
        new Drink("Cappuccino", 60, "Tall", 0.1, 8, new BigDecimal("5.99")),
        new Drink("Latte", 130, "Grande", 0.3, 18, new BigDecimal("10.99")),
        new Drink("Hot Chocolate", 320, "Venti", 3.0, 38, new BigDecimal("15.35"))
);

我使用

BigDecimal
而不是
double
来表示价格,因为
BigDecimal
更适合表示货币价值

© www.soinside.com 2019 - 2024. All rights reserved.