Как мога да поправя грешката си с дублирани деца?

В момента имам проблем с моя код. Имам бутон, който трябва да преминава през списък с масиви 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
благодаря ти за съвета! Имате ли съвет относно грешката, която имам? @Jägermeister   -  person John Doe    schedule 27.04.2015
comment
Stacktrace с грешката ще помогне.   -  person Ostap Maliuvanchuk    schedule 27.04.2015
comment
А, да, добра гледна точка! @потребител979349. Така че мога да създам 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)


С e. ж. 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 = нов ArrayList‹Images› вместо масив. И да, просто премахнете този, който използвате от списъка. - person Roland; 27.04.2015
comment
Получавам грешка при несъвместим тип, когато се опитвам да използвам списък с масиви вместо масив. Трябва ли да променя и начина, по който преминавам през изображенията, за да поправя това? - person John Doe; 27.04.2015