另一个setOnAction中的setOnAction不适用于Javafx中的按钮数组

时间:2016-10-12 10:54:24

标签: java

我实际上不确定标题,因为我不知道这是不是真正的问题。 我正在制作这个应用程序,用户点击一个加号或减号按钮来获取一些人,然后每个人还有两个加号和减号按钮来获得另一个必须乘以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()))));
        }
}



}

1 个答案:

答案 0 :(得分:0)

错误正是它所说的:我必须是最终的(或者实际上是最终的,这意味着编译器必须能够推断变量永远不会改变。

在你的情况下,i会发生变化(0到10之间),所以它不是“有效的最终结果”。

您要做的是添加一个变量来保存i的当前快照并将其存储在最终变量中;例如,在循环的顶部添加:

final int snapshot = i;

如果你考虑一下,这种Java行为是非常合乎逻辑的 - 当任何一个监听器触发时,所讨论的循环结束了,所以没有当前值这样的东西。相反,在监听器建立时,迭代期间会获得i值的快照