Как я могу исправить ошибку «Повторяющиеся дети»?

В настоящее время у меня проблемы с моим кодом. У меня есть кнопка, которая должна перебирать список массивов ImageView, который я создал, и отображать 4 карты при каждом нажатии. Прямо сейчас я могу заставить свою кнопку «Играть» работать, ее основная функция - просто отображать карты 1 раз, а затем отключаться. Кнопка «Раздать» должна отображать 4 случайные карты каждый раз, когда я нажимаю ее, пока все карты не исчезнут. Прямо сейчас я могу заставить его изменить 1 карту 1 раз, а затем я получаю сообщение об ошибке «Дубликаты детей». Я знаю, что проблема связана с тем, что каждый раз зацикливаются на одних и тех же границах, но я надеялся получить совет о том, как решить эту проблему. Я знаю, что это может потребовать значительного изменения моего кода, и это нормально. Благодарю вас!

        import java.io.File;
        import java.util.ArrayList;
        import javafx.scene.image.Image;
        import javafx.scene.image.ImageView;
        import java.util.Collections;
        import java.util.EnumSet;
        import java.util.List;
        import javafx.application.Application;
        import javafx.event.*;
        import javafx.scene.Scene;
        import javafx.scene.control.Button;
        import javafx.stage.Stage;
        import javafx.scene.layout.*;
        import javafx.scene.control.Label;
        import javafx.geometry.*;
        import java.util.*;

        import javafx.scene.Node;
        import javafx.scene.image.Image;
        import javafx.scene.image.ImageView;
        import javafx.scene.paint.Color;

        import javax.swing.*;

public class War extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    List<Integer> deck;
    ArrayList<ImageView> imager = new ArrayList<ImageView>();
    private int roundCounter;
    JButton button = new JButton();

    @Override
    public void start(Stage primaryStage) {
        loadDeck();
        loadCards();
        //Panes
        BorderPane bPain = new BorderPane();
        VBox vBox = new VBox(100);
        vBox.setPadding(new Insets(5, 5, 5, 5));
        HBox buttonBox = new HBox(100);
        buttonBox.setPadding(new Insets(25, 25, 25, 75));
        buttonBox.setStyle("-fx-background-color: blue");


        BorderPane bPain4 = new BorderPane();
        bPain.setLeft(new P1Pane("PLayer 1"));
        bPain4.setRight(new P2Pane("PLayer 2"));
        BorderPane bPain2 = new BorderPane();
        bPain2.setRight(new P3Pane("PLayer 4"));
        bPain2.setLeft(new P4Pane("PLayer 3"));




        BorderPane bPain3 = new BorderPane();
        DeckPane dPane = new DeckPane("Deck");


        bPain3.setCenter(dPane);
        bPain3.setMargin(dPane, new Insets(5, 5, 5, 5));
        bPain3.setCenter(dPane);

        //Buttons
        Button pBtn = new Button("PLAY");
        Button dBtn = new Button("DEAL");
        Button endBtn = new Button("END GAME");
        buttonBox.getChildren().addAll(pBtn, dBtn , endBtn);


        vBox.getChildren().addAll(buttonBox, bPain, bPain3, bPain2, bPain4);


        pBtn.setOnAction(
                p -> {System.out.println("Play pressed");
                loadCards();

            });
        pBtn.setOnAction(new EventHandler<ActionEvent>() {


            public void handle(ActionEvent p) {
                bPain.getChildren().add(imager.get(10));
                bPain4.getChildren().add(imager.get(20));
                bPain2.getChildren().add(imager.get(30));
                bPain3.getChildren().add(imager.get(40));
            }
        });


        dBtn.setOnAction(new EventHandler<ActionEvent>() {


            public void handle(ActionEvent d) {
                for(int i = 0; i<deck.size(); i++){
                //bPain2.getChildren().add(imager.get(i));
                //bPain4.getChildren().add(imager.get(i));
                bPain.getChildren().add(imager.get(i));
                //bPain3.getChildren().add(imager.get(i));
                }
            }
        });

        endBtn.setOnAction(
                e -> {
                    //when pressed, popup asks if sure
                    //disabled after
                    //resets number of wins
                    System.out.println("End pressed");
                });



        //Stage set
        primaryStage.setTitle("WAR!!!");
        //primaryStage.setScene(new Scene(vBox2, 100, 100));
        primaryStage.setScene(new Scene(vBox, 500, 500));

        primaryStage.show();
    }

    public void loadCards() {

        String path = "/users/ebrovski/Desktop/card";
        String files;
        File folder = new File(path);
        Image[] images = new Image[100];
        File[] listOfFiles = folder.listFiles();
        int j = 0;
        for (int i = 0; i < listOfFiles.length; i++) {
            if (listOfFiles[i].getName().endsWith("png")) {
                System.out.println(listOfFiles[i].getAbsolutePath());

                files = "file:" + listOfFiles[i].getAbsolutePath();
                System.out.println(files);

                images[j] = new Image(files, 200, 200, true, true);

                j++;
            }
        }

        for(int k = 0; k < deck.size(); k++) {
            imager.add(new ImageView(images[deck.get(k)]));

        }
    }



    public void loadDeck() {
        deck = new ArrayList<Integer>();
        for(int i =0; i < 52; i++) {
            deck.add(i);
        }
        Collections.shuffle(deck);
    }


    //Player Panes
    class P1Pane extends Pane {

        private void add(ImageView get) {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
        public P1Pane(String player) {
            Label playerTitle = new Label(player);
            getChildren().add(playerTitle);
            setStyle("-fx-border-color: black");
            //setStyle("-fx-background-color: green");
            setPadding(new Insets(75, 1, 1, 1));

           // getChildren().add(imager.get(10));

        }
    }

    class P2Pane extends Pane {
        public P2Pane(String player) {
            Label playerTitle = new Label(player);
            getChildren().add(playerTitle);
            setStyle("-fx-border-color: black");
            //setStyle("-fx-background-color: green");
            setPadding(new Insets(75, 1, 1, 1));
            //getChildren().add(imager.get(20));
        }
    }
    class P3Pane extends Pane {
        public P3Pane(String player) {
            Label playerTitle = new Label(player);
            getChildren().add(playerTitle);
            setStyle("-fx-border-color: black");
            //setStyle("-fx-background-color: green");
            setPadding(new Insets(75, 3, 3, 3));
            //getChildren().add(imager.get(40));

        }
    }

    class P4Pane extends Pane {
        public P4Pane(String player) {
            Label playerTitle = new Label(player);
            getChildren().add(playerTitle);
            setStyle("-fx-border-color: black");
            //setStyle("-fx-background-color: green");
            setPadding(new Insets(75, 3, 3, 3));
            //getChildren().add(imager.get(30));
        }
    }


    //Deck Pane
    class DeckPane extends Pane {
        public DeckPane(String deckName) {
            Label deckTitle = new Label(deckName);
            getChildren().add(deckTitle);

            setStyle("-fx-border-color: black");
            //setStyle("-fx-background-color: forestgreen");
            setPadding(new Insets(75, 3, 3, 3));

        }
    }


}

Теперь, когда я нахожусь на своем рабочем компьютере, я получаю другую ошибку, связанную с моим loadDeck(); метод. Вот ошибка времени выполнения: Пожалуйста, помогите!

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:363)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:303)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:875)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$147(LauncherImpl.java:157)
    at com.sun.javafx.application.LauncherImpl$$Lambda$49/28230490.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 100
    at war.War.loadCards(War.java:151)
    at war.War.start(War.java:50)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153(LauncherImpl.java:821)
    at com.sun.javafx.application.LauncherImpl$$Lambda$64/26176767.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(PlatformImpl.java:323)
    at com.sun.javafx.application.PlatformImpl$$Lambda$46/11567059.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$164(PlatformImpl.java:292)
    at com.sun.javafx.application.PlatformImpl$$Lambda$48/14442382.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(PlatformImpl.java:291)
    at com.sun.javafx.application.PlatformImpl$$Lambda$47/30452001.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
    at com.sun.glass.ui.win.WinApplication$$Lambda$38/2075313.run(Unknown Source)
    ... 1 more

person John Doe    schedule 27.04.2015    source источник
comment
Примечание по стилю кодирования: я нахожу ваши имена довольно неудобными; зачем называть что-то bPain, когда что-то вроде centralPane на самом деле скажет вам, для чего это нужно? Значение: ваши префиксы, такие как b и v; затем смешанные с постфиксами, такими как Btn или Pain ... больше сбивают с толку, чем помогают.   -  person GhostCat    schedule 27.04.2015
comment
Спасибо за совет! У вас есть какие-либо советы по поводу моей ошибки? @Егермейстер   -  person John Doe    schedule 27.04.2015
comment
Stacktrace с ошибкой поможет.   -  person Ostap Maliuvanchuk    schedule 27.04.2015
comment
Ах да хороший момент! @user979349 . Итак, я мог бы создать Stacktrace, а затем как добавить в него изображения?   -  person John Doe    schedule 27.04.2015
comment
Я имею в виду опубликовать здесь трассировку стека исключений.   -  person Ostap Maliuvanchuk    schedule 27.04.2015
comment
Нет необходимости в изображениях, просто опубликуйте полное сообщение об ошибке, включая трассировку стека, которую вы получаете при возникновении исключения.   -  person Nate Barbettini    schedule 27.04.2015
comment
опубликовал ошибку, которую я сейчас получаю @NateBarbettini   -  person John Doe    schedule 27.04.2015


Ответы (1)


С эл. грамм. bPain.getChildren().add(imager.get(i)); вы добавляете ImageView в bPain. В следующий раз, когда действие будет вызвано, вы снова добавите тот же ImageView, хотя он уже находится в сцене.

Вы должны добавить детей только один раз в сцену.

И ошибка

Вызвано: java.lang.ArrayIndexOutOfBoundsException: 100

вы только что опубликовали, потому что вы ограничили Image[] images = new Image[100];

Либо прекратите добавлять элементы в массив после достижения предела размера, либо используйте ArrayList.

person Roland    schedule 27.04.2015
comment
правильно это имеет смысл. Как я могу каждый раз добавлять разные изображения на панели? - person John Doe; 27.04.2015
comment
Я понятия не имею, чего вы хотите добиться. Если вы хотите просто использовать случайное изображение, загрузите изображения в ArrayList, вызовите для него shuffle() и каждый раз, когда вы хотите использовать изображение из списка, удаляйте изображение из списка. - person Roland; 27.04.2015
comment
Я пытаюсь заставить свою кнопку отображать 4 случайных изображения из созданной мной колоды каждый раз, когда я нажимаю. В файле 52 карты, так что, по сути, это будет 12 раз, потому что кнопка воспроизведения отображает первые 4. Итак, я бы перетасовал и удалил 4 карты в своем обработчике событий? - person John Doe; 27.04.2015
comment
Что касается моей ошибки, о которой я писал выше, я изменил Image[] images = new Image[200]; и перестал получать. Теперь я вернулся к ошибке повторяющихся детей. - person John Doe; 27.04.2015
comment
Используйте List‹Image› images = new ArrayList‹Images› вместо массива. И да, просто удалите тот, который вы используете, из списка. - person Roland; 27.04.2015
comment
Я получаю сообщение об ошибке несовместимого типа при попытке использовать список массивов вместо массива. Нужно ли мне изменить способ просмотра изображений, чтобы исправить это? - person John Doe; 27.04.2015