无法将在动作集上创建的Arraylist传递给动作集上的另一个事件处理程序

时间:2019-04-09 18:26:51

标签: java eclipse javafx

我有2个需要访问同一数组的按钮,并且给出了错误封闭范围内定义的局部变量 newCards 必须是final或有效的final。

我在做错什么事吗,即违反Java规则?

这是我到目前为止编写的代码:

    final ArrayList<Integer> newDeck = new ArrayList<Integer>();
    ShuffleFunctions.shuffleDeck(newDeck);

    int number = Integer.parseInt(cardNbr.getText());
     ArrayList<Integer> newCards = new ArrayList<Integer>();
    newCards = ShuffleFunctions.randomCardsSelector(number, newDeck);


    submitBtn.setOnAction(e->{

        fetchBtn.setDisable(false);
        submitBtn.setDisable(true);


        for(int i = 0; i<number; i++) {
            int x = newCards.get(i);
            String url = new String("bin/"+ x +".png");
            File file1 = new File(url);
            Image image1 = new Image(file1.toURI().toString());
            ImageView imageView = new ImageView(image1);
            imageView.setFitHeight(90);
            imageView.setFitWidth(90);
            drawnCards.getChildren().add(imageView);
        }
    });



    fetchBtn.setOnAction(e->{
        fetchBtn.setDisable(true);

        ArrayList<Integer> selectedNewCard= new ArrayList<Integer>();
        selectedNewCard = ShuffleFunctions.randomCardsSelector(1, newDeck);

        int s = selectedNewCard.get(0);
        String url = new String("bin/" + s + ".png");
        File file2 = new File(url);
        Image img = new Image(file2.toURI().toString());
        drawnCard.setImage(img);
        drawnCard.setFitHeight(150);
        drawnCard.setFitWidth(150);
    });

    drawCardBtn.setOnAction(e->{
        drawCardBtn.setDisable(false);

        ArrayList<Integer> oneCard = new ArrayList<Integer>();
        oneCard = ShuffleFunctions.randomCardsSelector(1,newCards);

        String url = new String("bin/" /*x*/ + ".png");
        File file3 = new File(url);
        Image image = new Image(file3.toURI().toString());
        drawnCard.setImage(image);
        drawnCards.getChildren().get(0).setStyle("-fx-opacity: 0.5");
    });

1 个答案:

答案 0 :(得分:1)

JAVA中的lambda函数不允许这样做。

问题是,您正在多个lambda函数中使用一个变量,该变量将在将来的某个时间点执行,并且无法预先确定。
为了防止这种未知行为,JAVA强制将局部变量设置为 final ,以使它们的状态不会改变并且我们(代码)可以具有可预测的行为。

解决此问题的唯一方法是将变量设置为 final