Исключение для getChildren (). AddAll () - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь создать программу javafx, которая создает шахматную доску.Однако, когда я пытаюсь запустить мою программу, она выдает исключения в этой строке: optionsPane.getChildren (). AddAll (optionsPane, n_input, grid_display, label, createButton); Это исключения:

Исключение в методе запуска приложения..invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs (LauncherImpl.java.sun9 в com)javafx.application.LauncherImpl.launchApplication (LauncherImpl.java:328) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invokeDelegatingMethodAccessorImpl.java:43) вjava.lang.reflect.sun.javafx.application.LauncherImpl.launchApplication1 (LauncherImpl.java:917) в com.sun.javafx.application.LauncherImpl.lambda $ launchApplication $ 155 (LauncherImpl.java:182) в java.lang.Threadjrun (поток: 745) Причина: java.lang.IllegalArgumentException: дочерние элементы: обнаружен цикл: parent = HBox @ ca2959, node = HBox @ ca2959 в javafx.scene.Parent $ 2.onProposedChange (Parent.java:445) в com.sun.javafx.collections.application.LauncherImpl.lambda $ launchApplication1 $ 162 (LauncherImpl.java:863) в com.sun.javafx.application.PlatformImpl.lambda $ runAndWait $ 175 (PlatformImpl.java: 326) в com.sun.javafx.application.PlatformImpl.lambda $ null $ 173 (PlatformImpl.java:295) в java.security.AccessController.doPrivileged (собственный метод) в com.sun.javafx.application.PlatformImpl.lambda $runLater $ 174 (PlatformImpl.java:294) на com.sun.glass.ui.InvokeLaterDispatcher $ Future.run (InvokeLaterDispatcher.java:95) на com.sun.glass.ui.win.WinApplication._runLoop (собственный метод) в com.sun.glass.ui.win.WinApplication.lambda $ null $ 148 (WinApplication.java:191) ... еще 1

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class DD_CheckerBoard extends Application {

    Scene scene1, scene2; //2 scenes created to pass from a scene to another scene when create a checkerboard is clicked

    @Override
    public void start(Stage primaryStage) throws Exception{

        primaryStage.setTitle("My Checkerboard");

        //Scene 1
        HBox optionsPane = new HBox(10);
        optionsPane.setAlignment(Pos.CENTER); //sets alignment
        TextField n_input = new TextField(); //gets n from the user
        TextField grid_display = new TextField(); //only displays n x n
        grid_display.setEditable(false);
        Label label = new Label("Enter a single number to customize grid size.");
        Button createButton = new Button("Create New Checkerboard"); //button to create the new grid for checkerboard
        createButton.setOnAction(e-> primaryStage.setScene(scene2)); //calls checkerboard to the scene
        optionsPane.getChildren().addAll(optionsPane, n_input, grid_display, label, createButton); //add components
        scene1 = new Scene(optionsPane, 300,250); //create scene 1 for optionsPane

        //Scene 2
        getCheckerBoard(n_input); //create the checkerboard using the input from the user

        //SET SCENE
            primaryStage.setScene(scene1); // Place in scene in the stage, first scene is for the option pane
            primaryStage.show(); // Display the stage;
        }

    /**
     * And this method creates the checkerboard
     * @param input n by the user
     */
    public void getCheckerBoard(TextField input) {
            GridPane checkerboardPane = new GridPane(); //create a grid pane
            int n = Integer.parseInt(input.getText()); //parse input n to int
            int count = 0; //keep count of rectangles
            double s = 70; // side of rectangle
            for (int i = 0; i < n; i++) { //create the grid and rectangles
                count++; //increment count
                for (int j = 0; j < n; j++) {
                    Rectangle r = new Rectangle(s, s, s, s);
                    if (count % 2 == 0) r.setFill(Color.BLACK); //put rectangles to assigned colors in order
                    else r.setFill(Color.WHITE);
                    checkerboardPane.add(r, j, i); //add components to checkerboard
                    count++; //increment count
                } }
            scene2 = new Scene(checkerboardPane); //Create scene 2
         }

    public static void main(String[] args) throws Exception{
        launch(args);
    }
}

1 Ответ

1 голос
/ 15 марта 2019

Вы пытаетесь добавить свой optionsPane как дочерний элемент к себе:

optionsPane.getChildren().addAll(optionsPane, n_input, grid_display, label, createButton);

Это вызывает исключение, которое вы получаете.Чтобы это исправить, просто удалите optionsPane из списка детей:

optionsPane.getChildren().addAll(n_input, grid_display, label, createButton);

Но вы также получите NumberFormatException, потому что ваше текстовое поле по умолчанию пусто:

java.lang.NumberFormatException: для входной строки: ""

Так что вам, возможно, следует установить значение по умолчанию для вашего TextField:

TextField n_input = new TextField("0");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...