如何将 java lang 中的对象添加到 fxml 文件

how to add an object in java lang to the fxml file

我正在尝试制作游戏 我在 java class 和 fxml 文件中 UI 的另一部分制作了一个单元格但是当我 运行 它 ide 给出:

JavaFX 应用程序线程”java.lang.RuntimeException:java.lang.reflect.InvocationTargetException 并多次向构造函数指出包含单元格的数组请帮助

这里是用户网格 class 包含单元格 class 鼠标手势和实际网格 请注意鼠标手势 class 不完整,因为我正在尝试解决此问题

package sample;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;

import java.lang.reflect.InvocationTargetException;

public class userGrid extends Pane {
    static int  row;
    static int column;

    static int height;
    static int width;

    static boolean star;
    static boolean wall;

    @FXML
    StackPane gridRoot;
    gridCell [][] boardCells;
    userGrid actualGrid = new userGrid();
    public  userGrid() {
        try {
            actualGrid.row = DataModel.row;
            actualGrid.column = DataModel.column;

            actualGrid.star = false;
            actualGrid.wall = false;

            actualGrid.width = DataModel.gridWidth;
            actualGrid.height = DataModel.gridHeight;

            actualGrid.boardCells = new gridCell[row][column];

            MouseGesture M = new MouseGesture();
            for (int y = 0; y < actualGrid.row; y++) {
                for (int x = 0; x < actualGrid.column; x++) {
                    gridCell cell = new gridCell(y, x, false, false);
                    M.paint(cell);
                    actualGrid.add(cell, row, column);

                }
            }
            gridRoot.getChildren().add(actualGrid);
        }catch (Exception e){
            e.getCause();
            System.out.println("check");
            e.printStackTrace();
        }

    }
    public void add(gridCell cell,int row,int column){
        int cellWidth = userGrid.width/userGrid.column;
        int cellHeight = userGrid.height/userGrid.row;
        int x = cellWidth*column;
        int y= cellHeight*row;

        boardCells[x][y] = cell;
        cell.setPrefSize(cellWidth,cellHeight);
        cell.setTranslateX(x);
        cell.setTranslateY(y);
        getChildren().add(cell);

    }
    public gridCell getCell(int x,int y){ return boardCells[x][y]; }

    public class gridCell extends StackPane{
        int row;
        int column;
        boolean star;
        boolean wall;
        public gridCell(int row,int column,boolean star,boolean wall){
            this.star=star;
            this.wall=wall;
            this.row=row;
            this.column=column;
            getStyleClass().add("cell");
        }
        public void makeStar(){
            getStyleClass().remove("cell-highlight");
            getStyleClass().add("cell-star-highlight");
        }
        public void makeSmileyFace(int n){
            if(n==1){
                getStyleClass().remove("cell-highlight");
                getStyleClass().add("cell-smiley1-highlight");
            }else if(n==2){
                getStyleClass().remove("cell-smile2-highlight");
                getStyleClass().add("cell-smiley2-highlight");
            }
        }
        public void makeWall(){
            getStyleClass().remove("cell-wall-highlight");
            getStyleClass().add("cell-wall-highlight");
        }
        public void cellHover(){
            getStyleClass().remove("cell-hover-highlight");
            getStyleClass().add("cell-hover-highlight");
        }

        public void RemoveStar(){
            getStyleClass().remove("cell-highlight");
            getStyleClass().add("cell-star-highlight");
        }

        public void RemoveSmileyFace(int n){
            if(n==1){
                getStyleClass().remove("cell-highlight");
            }else if(n==2){
                getStyleClass().remove("cell-smile2-highlight");
            }
        }

        public void RemoveWall(){
            getStyleClass().remove("cell-wall-highlight");
        }
        public void UnhighlightHover(){
            getStyleClass().remove("cell-hover-highlight");
        }

        public String toString() {
            return this.column + "C||R" + this.row;
        }
    }

    public class MouseGesture{
        public void paint(Node node){
            if(true){
                node.hoverProperty().addListener(new ChangeListener<Boolean>(){
                  @Override
                    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue){

                      System.out.println( observable + ": " + newValue);

                      if( newValue) {
                          ((gridCell) node).cellHover();
                      } else {
                          ((gridCell) node).UnhighlightHover();
                      }

                      for( String s: node.getStyleClass())
                          System.out.println( node + ": " + s);
                  }

                });


//                node.setOnMousePressed( onMousePressedEventHandler);
//                node.setOnDragDetected( onDragDetectedEventHandler);
//                node.setOnMouseDragEntered(onMouseDragEnteredEventHandler);

            }


        }



    }

}

这是fxml文件 我制作了一些按钮,然后尝试使用 fx:id of grid root

将实际网格添加到堆栈窗格
<?xml version="1.0" encoding="UTF-8"?>
<!--<?import sample.userGrid?>-->
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.layout.GridPane?>


<?import javafx.scene.layout.StackPane?>
<GridPane prefHeight="400.0" prefWidth="600.0" stylesheets="@userGrid.css"
          xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1"
          fx:controller="sample.userGrid">
    <VBox>
    <HBox alignment="TOP_LEFT">
        <Button fx:id="starButton" id="starButton-highlight" text="Star" ></Button>
        <Button fx:id="wallButton" id="wallButton-highlight" text="Wall" ></Button>
        <Button fx:id="smiley1Button" id="smiley1Button-highlight" text="smiley1" ></Button>
        <Button fx:id="smiley2Button" id="smiley2Button-highlight" text="smiley2" ></Button>
    </HBox>
        <StackPane fx:id="gridRoot">
            <children>

            </children>
        </StackPane>

    </VBox>

</GridPane>

这是我尝试调用网格的方式,注意在我尝试确定问题原因时有一些 try catch 块

package sample;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

import java.io.IOException;



public class initializePageController {
    @FXML
    TextField GridWidth;
    @FXML
    TextField GridHeight;
    @FXML
    TextField row;
    @FXML
    TextField column;
    @FXML
    TextField name1;
    @FXML
    TextField name2;

    Parent root;
    Stage stage;


    public void pageDimensions() throws IOException {
        int gHeight =Integer.parseInt(GridHeight.getText());
        int gWidth = Integer.parseInt(GridHeight.getText());
        int rrow = Integer.parseInt(row.getText());
        int ccolumn = Integer.parseInt(column.getText());
        DataModel.gridHeight=gHeight;
        DataModel.gridWidth=gWidth;
        DataModel.row=rrow;
        DataModel.column=ccolumn;
        try {
            System.out.println("Dimension Happened");
            //System.out.println( gHeight);
            System.out.println("AIMING FOR GRID");

            try {
                root = FXMLLoader.load(getClass().getResource("/sample/GridInitializer.fxml"));
                stage = (Stage) row.getScene().getWindow();
                Scene scene = new Scene(root, DataModel.gridWidth, DataModel.gridHeight);
                stage.setScene(scene);
                stage.setTitle("please god ");
                stage.show();
            } catch (Exception e) {

                System.out.println("grid initiakizer went wring /init.page controller");
                e.printStackTrace();
            }
        }catch (Exception ex){
            System.out.println("101");
            ex.getCause();
            System.out.println("101");
        }

    }
}

这里是包含数据的数据模型class

package sample;

public class DataModel {
    public static int gridHeight;
    public static int gridWidth;
    public static String name1;
    public static String name2;
    public static int row;
    public static int column;


}

和用于设计代码的css文件

.cell{
    -fx-background-color: rgb(38,38,38);
    -fx-border-color: red;
    -fx-border-width: 1px;
}
.cell-highlight {
    -fx-background-color:derive(blue,0.9);
}
.cell-hover-highlight {
    -fx-background-color:derive(green,0.9);
}
.cell-star-highlight{
    -fx-background-color: derive(yellow,1%);
    -fx-shape: "M 100 0 L175 200 L0 75 L200 75 L25 200 Z";
}
.cell-smily1-highlight{
 -fx-shape: "M2 1 h1 v1 h1 v1 h-1 v1 h-1 v-1 h-1 v-1 h1 z";
    -fx-background-color: derive(red,10%);
}
.cell-smily2-highlight{
    -fx-background-color: derive(blue,10%);
    -fx-shape: "M2 1 h1 v1 h1 v1 h-1 v1 h-1 v-1 h-1 v-1 h1 z";
}
.cell-wall-highlight{

}

这是完整的堆栈跟踪,前三行只是检查`

action happend
Dimension Happened
AIMING FOR GRID
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    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.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.access00(Scene.java:3398)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
    at javafx.scene.Scene$MouseHandler.access00(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:394)
    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(GlassViewEventHandler.java:432)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:410)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
    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(WinApplication.java:186)
    at java.lang.Thread.run(Thread.java:748)
Caused by: 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:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
    ... 31 more
Caused by: java.lang.WhosebugError
    at javafx.scene.Node.getScene(Node.java:932)
    at javafx.scene.Node.updateCanReceiveFocus(Node.java:8099)
    at javafx.scene.Node.setTreeVisible(Node.java:8007)
    at javafx.scene.Node.updateTreeVisible(Node.java:7998)
    at javafx.scene.Node.<init>(Node.java:2349)
    at javafx.scene.Parent.<init>(Parent.java:1295)
    at javafx.scene.layout.Region.<init>(Region.java:457)
    at javafx.scene.layout.Pane.<init>(Pane.java:124)
    at sample.userGrid.<init>(userGrid.java:26)
    at sample.userGrid.<init>(userGrid.java:25)
    at sample.userGrid.<init>(userGrid.java:25)
    at sample.userGrid.<init>(userGrid.java:25)

是的,James_D 明白了。我测试了您的代码并进行了一些调整,它起作用了。看:

Main.java

package application;

import controller.InitializePageController;
import javafx.application.Application;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {

            InitializePageController startApp = new InitializePageController();
            startApp.pageDimensions();

        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

DataModel.java

package model;

public class DataModel {
    public static int gridHeight;
    public static int gridWidth;
    public static String name1;
    public static String name2;
    public static int row;
    public static int column;
}

UserGrid.java(修复 Whosebug 异常)

package action;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import model.DataModel;

public class UserGrid extends Pane {

    static int row;
    static int column;

    static int height;
    static int width;

    static boolean star;
    static boolean wall;

    @FXML
    StackPane gridRoot;
    gridCell [][] boardCells;

    public void init() {

        try {
            UserGrid actualGrid = new UserGrid();
            UserGrid.row = DataModel.row;
            UserGrid.column = DataModel.column;

            UserGrid.star = false;
            UserGrid.wall = false;

            UserGrid.width = DataModel.gridWidth;
            UserGrid.height = DataModel.gridHeight;

            actualGrid.boardCells = new gridCell[row][column];

            MouseGesture M = new MouseGesture();
            for (int y = 0; y < UserGrid.row; y++) {
                for (int x = 0; x < UserGrid.column; x++) {
                    gridCell cell = new gridCell(y, x, false, false);
                    M.paint(cell);
                    actualGrid.add(cell, row, column);

                }
            }
            gridRoot.getChildren().add(actualGrid);

        } catch (Exception e){

            e.getCause();
            System.out.println("check");
            e.printStackTrace();
        }

    }

    public void add(gridCell cell,int row,int column){

        int cellWidth = UserGrid.width/UserGrid.column;
        int cellHeight = UserGrid.height/UserGrid.row;
        int x = cellWidth*column;
        int y= cellHeight*row;

        boardCells[x][y] = cell;
        cell.setPrefSize(cellWidth,cellHeight);
        cell.setTranslateX(x);
        cell.setTranslateY(y);
        getChildren().add(cell);

    }

    public gridCell getCell(int x,int y){
        return boardCells[x][y];
    }

    public class gridCell extends StackPane{

        int row;
        int column;
        boolean star;
        boolean wall;

        public gridCell(int row,int column,boolean star,boolean wall){
            this.star=star;
            this.wall=wall;
            this.row=row;
            this.column=column;
            getStyleClass().add("cell");
        }

        public void makeStar(){
            getStyleClass().remove("cell-highlight");
            getStyleClass().add("cell-star-highlight");
        }

        public void makeSmileyFace(int n){
            if(n==1){
                getStyleClass().remove("cell-highlight");
                getStyleClass().add("cell-smiley1-highlight");
            }else if(n==2){
                getStyleClass().remove("cell-smile2-highlight");
                getStyleClass().add("cell-smiley2-highlight");
            }
        }

        public void makeWall(){
            getStyleClass().remove("cell-wall-highlight");
            getStyleClass().add("cell-wall-highlight");
        }

        public void cellHover(){
            getStyleClass().remove("cell-hover-highlight");
            getStyleClass().add("cell-hover-highlight");
        }

        public void RemoveStar(){
            getStyleClass().remove("cell-highlight");
            getStyleClass().add("cell-star-highlight");
        }

        public void RemoveSmileyFace(int n){
            if(n==1){
                getStyleClass().remove("cell-highlight");
            }else if(n==2){
                getStyleClass().remove("cell-smile2-highlight");
            }
        }

        public void RemoveWall(){
            getStyleClass().remove("cell-wall-highlight");
        }

        public void UnhighlightHover(){
            getStyleClass().remove("cell-hover-highlight");
        }

        public String toString() {
            return this.column + "C||R" + this.row;
        }
    }

    public class MouseGesture{

        public void paint(Node node){

            if(true){

                node.hoverProperty().addListener(new ChangeListener<Boolean>(){

                    @Override
                    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue){

                        System.out.println( observable + ": " + newValue);

                        if(newValue) {

                            ((gridCell) node).cellHover();

                        } else {

                            ((gridCell) node).UnhighlightHover();
                        }

                        for(String s: node.getStyleClass()){
                            System.out.println( node + ": " + s);
                        }
                    }

               });
            }
        }
    }
}

InitializerPageController.java

package controller;

import java.io.IOException;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import model.DataModel;

public class InitializePageController {
    
    @FXML
    TextField GridWidth;
    @FXML
    TextField GridHeight;
    @FXML
    TextField row;
    @FXML
    TextField column;
    @FXML
    TextField name1;
    @FXML
    TextField name2;

    Parent root;
    Stage stage = new Stage();


    public void pageDimensions() throws IOException {
      /*int gHeight =Integer.parseInt(GridHeight.getText());
        int gWidth = Integer.parseInt(GridWidth.getText());
        int rrow = Integer.parseInt(row.getText());
        int ccolumn = Integer.parseInt(column.getText());*/

        int gHeight =Integer.parseInt("50");
        int gWidth = Integer.parseInt("50");
        int rrow = Integer.parseInt("25");
        int ccolumn = Integer.parseInt("25");

        DataModel.gridHeight=gHeight;
        DataModel.gridWidth=gWidth;
        DataModel.row=rrow;
        DataModel.column=ccolumn;

        try {
            System.out.println("Dimension Happened");
            //System.out.println( gHeight);
            System.out.println("AIMING FOR GRID");

            try {
                root = FXMLLoader.load(getClass().getResource("../GridInitializer.fxml"));
                //stage = (Stage) row.getScene().getWindow();
                //Scene scene = new Scene(root, DataModel.gridWidth, DataModel.gridHeight);
                Scene scene = new Scene(root,800,800);
                stage.setScene(scene);
                stage.setTitle("please god ");
                stage.show();
                
            } catch (Exception e) {

                System.out.println("grid initiakizer went wring /init.page controller");
                e.printStackTrace();
            }
            
        } catch (Exception ex){
            System.out.println("101");
            ex.getCause();
            System.out.println("101");
        }

    }
}

GridInitializer.fxml

<?xml version="1.0" encoding="UTF-8"?>
<!--<?import sample.userGrid?>-->
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.layout.GridPane?>


<?import javafx.scene.layout.StackPane?>
<GridPane prefHeight="400.0" prefWidth="600.0" stylesheets="userGrid.css"
          xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1"
          fx:controller="action.UserGrid">
    <VBox>
    <HBox alignment="TOP_LEFT">
        <Button fx:id="starButton" id="starButton-highlight" text="Star" ></Button>
        <Button fx:id="wallButton" id="wallButton-highlight" text="Wall" ></Button>
        <Button fx:id="smiley1Button" id="smiley1Button-highlight" text="smiley1" ></Button>
        <Button fx:id="smiley2Button" id="smiley2Button-highlight" text="smiley2" ></Button>
    </HBox>
        <StackPane fx:id="gridRoot">
            <children>

            </children>
        </StackPane>

    </VBox>

</GridPane>

userGrid.css

.cell{
    -fx-background-color: rgb(38,38,38);
    -fx-border-color: red;
    -fx-border-width: 1px;
}
.cell-highlight {
    -fx-background-color:derive(blue,0.9);
}
.cell-hover-highlight {
    -fx-background-color:derive(green,0.9);
}
.cell-star-highlight{
    -fx-background-color: derive(yellow,1%);
    -fx-shape: "M 100 0 L175 200 L0 75 L200 75 L25 200 Z";
}
.cell-smily1-highlight{
 -fx-shape: "M2 1 h1 v1 h1 v1 h-1 v1 h-1 v-1 h-1 v-1 h1 z";
    -fx-background-color: derive(red,10%);
}
.cell-smily2-highlight{
    -fx-background-color: derive(blue,10%);
    -fx-shape: "M2 1 h1 v1 h1 v1 h-1 v1 h-1 v-1 h-1 v-1 h1 z";
}
.cell-wall-highlight{

}

最后是项目结构

希望对您有所帮助!