Невозможно передать Arraylist, созданный в наборе по действию, в другой набор в обработчике событий действия - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть 2 кнопки, которым требуется доступ к одному и тому же массиву, и он выдает ошибку. Локальная переменная newCards , определенная в прилагаемой области видимости, должна быть конечной или фактически конечной.

Я что-то не так делаю, то есть против правил 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 Ответ

1 голос
/ 09 апреля 2019

Это не разрешено с лямбда-функциями в JAVA.

Проблема в том, что вы используете переменную в нескольких лямбда-функциях, которые будут выполняться в определенный момент времени в будущем и которые не могут быть предварительно определены.
Чтобы предотвратить это неизвестное поведение, JAVA заставляет локальные переменные принимать значение final , чтобы их состояние не могло измениться, и мы (код) могли иметь предсказуемое поведение.

Единственный способрешить эту проблему, сделав переменную как final .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...