我实际上不确定标题,因为我不知道这是不是真正的问题。 我正在制作这个应用程序,用户点击一个加号或减号按钮来获取一些人,然后每个人还有两个加号和减号按钮来获得另一个必须乘以15的数字和结果显示在TextField中。 我不知道为什么我的代码给了我这个错误: "在封闭范围内定义的局部变量必须是最终的或有效的最终的#34;。 我评论了显示错误的代码。
非常感谢任何帮助。
非常感谢。
int arrayLength;
int counter = 1;
double bc = 15.00;
Button[] baggagePlus;
Button[] baggageMinus;
Label[] baggageCounter;
Label[] costBaggage;
CheckBox[] checkReturn;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
stage = primaryStage;
stage.setTitle("");
stage.setResizable(false);
pane = new BorderPane();
pane.setStyle("-fx-background: #CEF6D8;");
centerPane1 = new Pane();
GridPane mainGrid = new GridPane();
mainGrid.setPadding(new Insets(150, 0, 0, 100));
mainGrid.setVgap(50);
noPassGrid = new GridPane();
noPassGrid.setHgap(10);
adultPlus = new Button("+");
adultPlus.setMinWidth(50);
adultPlus.setFont(Font.font("Verdana", 20));
GridPane.setConstraints(adultPlus, 1, 0);
adultPlus.setOnAction(e -> {
plus(adultCounter);
getArraySize();
});
adultCounter = new Label("1");
adultCounter.setFont(Font.font("Verdana", 20));
GridPane.setConstraints(adultCounter, 2, 0);
adultMinus = new Button("-");
adultMinus.setMinWidth(50);
adultMinus.setFont(Font.font("Verdana", 20));
GridPane.setConstraints(adultMinus, 3, 0);
adultMinus.setOnAction(e -> {
minus(adultCounter);
getArraySize();
});
noPassGrid.getChildren().addAll(adultPlus, adultCounter, adultMinus);
GridPane.setConstraints(noPassGrid, 0, 2);
mainGrid.getChildren().addAll(noPassGrid);
search = new Button("SEARCH");
search.setPrefSize(300, 100);
search.setFont(new Font("Verdana", 30));
passengersGrid = new GridPane();
search.setOnAction(e -> {
passengersGrid.setPadding(new Insets(150, 0, 0, 450));
passengersGrid.setVgap(20);
passengersGrid.setHgap(20);
for(int i=0; i<arrayLength; i++) {
baggagePlus[i] = new Button("+");
baggagePlus[i].setMinWidth(50);
baggagePlus[i].setFont(Font.font("Verdana", 20));
GridPane.setConstraints(baggagePlus[i], 5, i);
baggageCounter[i] = new Label("0");
baggageCounter[i].setFont(Font.font("Verdana", 20));
GridPane.setConstraints(baggageCounter[i], 6, i);
baggagePlus[i].setOnAction(
new EventHandler<ActionEvent>() {
public void handle(ActionEvent e) {
plus(baggageCounter[i]); //The "i" is underlined showing error
doublePrice(checkReturn[i], costBaggage[i], bc, baggageCounter[i]);
}
});
baggageMinus[i] = new Button("-");
baggageMinus[i].setMinWidth(50);
baggageMinus[i].setFont(Font.font("Verdana", 20));
GridPane.setConstraints(baggageMinus[i], 7, i);
baggageMinus[i].setOnAction(
new EventHandler<ActionEvent>() {
public void handle(ActionEvent e) {
minus(baggageCounter[i]); //The "i" is underlined showing error
doublePrice(checkReturn[i], costBaggage[i], bc, baggageCounter[i]);
}
});
checkReturn[i] = new CheckBox();
checkReturn[i].setFont(Font.font(20));
GridPane.setConstraints(checkReturn[i], 10, i);
checkReturn[i].setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent e) {
//The "i" is underlined showing error
doublePrice(checkReturn[i], costBaggage[i], bc, baggageCounter[i]);
}
});
costBaggage[i] = new Label("€0.00");
costBaggage[i].setFont(Font.font("Verdana", 25));
GridPane.setConstraints(costBaggage[i], 18, i);
passengersGrid.getChildren().addAll(baggagePlus[i], baggageCounter[i], baggageMinus[i], checkReturn[i], costBaggage[i]);
}
});
centerPane1.getChildren().addAll(mainGrid, passengersGrid);
pane.setCenter(centerPane1);
bottom1 = new AnchorPane(search);
bottom1.setPadding(new Insets(0, 0, 100, 0));
AnchorPane.setRightAnchor(search, 150.0);
pane.setBottom(bottom1);
scene = new Scene(pane, 1200, 600);
stage.setScene(scene);
stage.show();
}
public void getArraySize() {
arrayLength = counter;
baggagePlus = new Button[arrayLength];
baggageMinus = new Button[arrayLength];
baggageCounter = new Label[arrayLength];
costBaggage = new Label[arrayLength];
checkReturn = new CheckBox[arrayLength];
}
public void plus(Label l) {
if(counter < 8) {
counter++;
l.setText("" + counter);
}
}
public void minus(Label l) {
if(counter > 1) {
counter--;
l.setText("" + counter);
}
}
public void doublePrice(CheckBox cb, Label ll, double bc, Label l) {
if(cb.isSelected()) {
ll.setText("€" + df.format(2 * bc * (Double.parseDouble(l.getText()))));
}
else {
ll.setText("€" + df.format(bc * (Double.parseDouble(l.getText()))));
}
}
}
答案 0 :(得分:0)
错误正是它所说的:我必须是最终的(或者实际上是最终的,这意味着编译器必须能够推断变量永远不会改变。
在你的情况下,i
会发生变化(0到10之间),所以它不是“有效的最终结果”。
您要做的是添加一个变量来保存i
的当前快照并将其存储在最终变量中;例如,在循环的顶部添加:
final int snapshot = i;
如果你考虑一下,这种Java行为是非常合乎逻辑的 - 当任何一个监听器触发时,所讨论的循环结束了,所以没有当前值这样的东西。相反,在监听器建立时,迭代期间会获得i值的快照。