Попытка использовать JavaFX connect4 с сервером для школы

У меня есть оставшийся проект из школы, что я не мог работать должным образом. У класса была текстовая игра Connect4, затем графический интерфейс (с использованием JavaFX), а затем сервер-клиент.

Мой автономный графический интерфейс будет работать до тех пор, пока игра не будет выиграна игроком, но он сработает в этот момент, если победит зеленый (длинное сообщение об ошибке, но, похоже, заканчивается в IllegalArgumentException, связанном с классом родительского класса java)

Кроме того, я не знаю, возможно ли для этого взаимодействие с сервером JavaFX, или если я должен отказаться и сделать качели, но я действительно хотел, чтобы это работало для моего спокойствия. Прямо сейчас я борюсь с идеей логики и GUI-логики для победы, но это единственный проект, в котором я мог бы работать в такой степени, плохой дизайн, какой он есть ...

Пожалуйста, дайте мне знать, нужна ли дополнительная информация, я знаю, что эта программа является беспорядком, поскольку я раньше не делал GUI, и я боюсь очистить программу до ее исправления. Исходный файл длинный, но ошибка, похоже, связана с исключением из незаконного аргумента с родительским объектом.

@Override
public void start(Stage primaryStage)
{
    GridPane rectangleRoot = new GridPane();
    GridPane circleRoot = new GridPane();
    makeCircleBoard(rectangleRoot, circleRoot, playerColor);

    rectangleRoot.setAlignment(Pos.CENTER);
    circleRoot.setAlignment(Pos.CENTER);

    Scene scene = new Scene(rectangleRoot, 1000, 1000);

    Rectangle gameBoardSpace = new Rectangle(scene.getWidth() / 2, scene.getHeight() 
 /2, Color.DARKBLUE);

    rectangleRoot.getChildren().add(gameBoardSpace);
    rectangleRoot.getChildren().add(circleRoot);

    primaryStage.setTitle("Connect4");
    primaryStage.setScene(scene);

    primaryStage.show();

}

public GridPane makeCircleBoard(GridPane rectangleRoot, GridPane circleRoot, String colorPassed)
{
    int rowPerCol[] = new int[7];   //for back end 2D array
    int turn = 1;   //game logic


    for(int i = 0; i < ROWMAX; i++)
    {
        for(int j = 0; j < COLMAX; j++)
        {
            gridLayout[i][j] = ' '
        }
    }
    for(int row = 0; row < 6; row++)
    {
        for(int col = 0; col < 7; col++)
        {
            GameSlot newCircle = new GameSlot(30, Color.WHITE);
            newCircle.setStrokeType(StrokeType.OUTSIDE);
            newCircle.setStroke(Color.web("black", 1.0));
            newCircle.setStrokeWidth(4);
            newCircle.setLocationRow(row);
            newCircle.setLocationCol(col);
            newCircle.setOnMouseClicked(new EventHandler<MouseEvent>()
            {
                @Override
                public void handle(MouseEvent e)
                {
                    if(newCircle.getOccupied() == false)
                    {
                        if(playerColor.equals("Yellow"))
                        {
                            gridLayout[newCircle.getLocationRow()][newCircle.getLocationCol()] = 'Y'
                            playerColor = "Green";
                            newCircle.setFill(Color.YELLOW);
                            newCircle.setOccupiedTrue();
                        }
                        else
                        {
                            gridLayout[newCircle.getLocationRow()][newCircle.getLocationCol()] = 'G'
                            playerColor = "Yellow";
                            newCircle.setFill(Color.GREEN);
                            newCircle.setOccupiedTrue();
                        }

                    }

                    if(gameWon(gridLayout))
                    {
                        if(playerColor.equals("Green"))
                        {
                            final Text actiontarget = new Text();
                            actiontarget.setFill(Color.CRIMSON);;
                            actiontarget.setText("YELLOW WON!!!");
                            actiontarget.setScaleX(10);
                            actiontarget.setScaleY(10);
                            actiontarget.setTranslateX(rectangleRoot.getWidth() / 5);
                            rectangleRoot.getChildren().add(actiontarget);

                        }
                        else
                        {
                            final Text actiontarget = new Text();
                            actiontarget.setFill(Color.CRIMSON);;
                            actiontarget.setText("GREEN WON!!!");
                            rectangleRoot.getChildren().add(actiontarget);
                            actiontarget.setScaleX(10);
                            actiontarget.setScaleY(10);
                            actiontarget.setTranslateX(rectangleRoot.getWidth() / 5);
                            rectangleRoot.getChildren().add(actiontarget);
                        }
                    }
                }   //end handle()

            });
                    //circle.setId(Integer.toString(i));
                    circleRoot.add(newCircle, row, col);



                    //newCircle.isWon(row, col);
        }

    }

Проверки на зеленый и желтый одинаковы. Он проверяет разные направления для цветных символов, противоположных цвету, который следующий. Я не вижу ошибок для Желтого в любом состоянии выигрыша, и у них есть проверка индекса в gridLayout2.

Exception in thread "JavaFX Application Thread" 
java.lang.IllegalArgumentException: Children: duplicate children added: parent = Grid hgap=0.0, vgap=0.0, alignment=CENTER
at javafx.scene.Parent$2.onProposedChange(Parent.java:454)
at com.sun.javafx.collections.VetoableListDecorator.add(VetoableListDecorator.java:206)
at Connect4.ui.Connect4GUI$1.handle(Connect4GUI.java:128)
at Connect4.ui.Connect4GUI$1.handle(Connect4GUI.java:1)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470)
at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:417)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)

Всего 1 ответ


Ошибка, которую вы получаете, - это IllegalArgumentException котором вы пытаетесь добавить Node в один и тот же Parent элемент более одного раза - это недопустимо в JavaFX. Если вы посмотрите на трассировку стека, вы увидите, где в вашем коде это происходит.

java.lang.IllegalArgumentException: Children: duplicate children added: parent = Grid hgap=0.0, vgap=0.0, alignment=CENTER
    at javafx.scene.Parent$2.onProposedChange(Parent.java:454)
    at com.sun.javafx.collections.VetoableListDecorator.add(VetoableListDecorator.java:206)
    at Connect4.ui.Connect4GUI$1.handle(Connect4GUI.java:128)
    at Connect4.ui.Connect4GUI$1.handle(Connect4GUI.java:1)

Первым фреймом, который не является внутренним кодом JavaFX, является Connect4.ui.Connect4GUI$1.handle(Connect4GUI.java:128) котором указано, что ошибка возникает в строке 128 вашего класса Connect4GUI внутри метода с именем handle . Вы не указываете, какая строка - строка 128 но на основе вашего кода и вышеприведенной информации, которую мы знаем, чтобы сосредоточиться на этой части вашего кода:

newCircle.setOnMouseClicked(new EventHandler<MouseEvent>()
{
    @Override
    public void handle(MouseEvent e)
    {
        if(newCircle.getOccupied() == false)
        {
            if(playerColor.equals("Yellow"))
            {
                gridLayout[newCircle.getLocationRow()][newCircle.getLocationCol()] = 'Y'
                playerColor = "Green";
                newCircle.setFill(Color.YELLOW);
                newCircle.setOccupiedTrue();
            }
            else
            {
                gridLayout[newCircle.getLocationRow()][newCircle.getLocationCol()] = 'G'
                playerColor = "Yellow";
                newCircle.setFill(Color.GREEN);
                newCircle.setOccupiedTrue();
            }

        }

        if(gameWon(gridLayout))
        {
            if(playerColor.equals("Green"))
            {
                final Text actiontarget = new Text();
                actiontarget.setFill(Color.CRIMSON);;
                actiontarget.setText("YELLOW WON!!!");
                actiontarget.setScaleX(10);
                actiontarget.setScaleY(10);
                actiontarget.setTranslateX(rectangleRoot.getWidth() / 5);
                rectangleRoot.getChildren().add(actiontarget);

            }
            else
            {
                final Text actiontarget = new Text();
                actiontarget.setFill(Color.CRIMSON);;
                actiontarget.setText("GREEN WON!!!");
                rectangleRoot.getChildren().add(actiontarget);
                actiontarget.setScaleX(10);
                actiontarget.setScaleY(10);
                actiontarget.setTranslateX(rectangleRoot.getWidth() / 5);
                rectangleRoot.getChildren().add(actiontarget);
            }
        }
    }   //end handle()
});

Рассматривая код, проблема может быть размещена внутри блока else который находится внутри блока if(gameWon(gridLayout)) :

else
{
    final Text actiontarget = new Text();
    actiontarget.setFill(Color.CRIMSON);;
    actiontarget.setText("GREEN WON!!!");
    rectangleRoot.getChildren().add(actiontarget); // DUPLICATE LINE BELOW
    actiontarget.setScaleX(10);
    actiontarget.setScaleY(10);
    actiontarget.setTranslateX(rectangleRoot.getWidth() / 5);
    rectangleRoot.getChildren().add(actiontarget); // DUPLICATE: Must be line 128
}

Удалите одно из этих утверждений, и код больше не должен IllegalArgumentException исключение IllegalArgumentException . Обратите внимание, что трассировка стека указывает, что вы прямо на оскорбительной строке кода, между прочим.


Есть идеи?

10000