2017-10-03 2 views
-1

Ich habe eine 9x9 GridPane in SceneBuilder erstellt, und ich möchte jede Zelle einzeln TextFields hinzufügen. Ich bin sicher, es gibt andere Methoden, um eine große Tabelle wie diese zu erstellen, aber ich suche nicht nach einer anderen Möglichkeit, dies zu tun (das ist Teil meiner Lernerfahrung). Ich möchte nicht TextFields in FXML/SceneBuilder hinzufügen; Ich möchte sie in einem Array verfolgen, damit ich auf ihre individuellen Werte zugreifen kann. Daher möchte ich sie einzeln im Controller erstellen und sie dann zum Array sowie zu jeder Zelle der GridPane hinzufügen.Erstellen einer Szene mit FXML und dem Controller in JavaFX

Hier ist der Teil meines Controller, die TextFields (Ich habe versucht, die Schaffung sie, bevor sich auf den Array hinzufügen) zu hinzufügen versucht:

@FXML 
private GridPane gridPane; 
private TextField myTextField[][] = new TextField[9][9]; 
. 
. 
. 
@Override 
public void initialize(URL url, ResourceBundle rb) { 
    for (int i = 0; i < 9; ++i){ 
     for (int j = 0; j < 9; ++j){ 

      TextField tempTextField = new TextField(); 
      Font myFont = new Font("System",38); 
      tempTextField.setFont(myFont); 
      tempTextField.setText(i + ", " + j); 
      tempTextField.setPrefSize(70, 70); 
      myTextField[i][j] = tempTextField; 
      gridPane.add(tempTextField,i,j); 
      System.out.println("TextField " +i+j+" Created!"); 
     } 
    } 
} 

ich vor der Laufzeit keinen Fehler bekommen und die Szene ist nicht aktualisiert.

EDIT: Ich habe am StackTrace sah und bemerkte, dass ich einen Null-Zeiger auf

gridPane.add(tempTextField,i,j); 

FXML Datei bin immer: Umsetzung

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.text.*?> 
<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<AnchorPane id="AnchorPane" prefHeight="654.0" prefWidth="747.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="sudokusolver.FXMLDocumentController"> 
    <children> 
     <BorderPane prefHeight="654.0" prefWidth="747.0"> 
     <center> 
      <GridPane fx:id="gridPane" gridLinesVisible="true" prefHeight="198.0" prefWidth="200.0" BorderPane.alignment="CENTER"> 
       <columnConstraints> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       </columnConstraints> 
       <rowConstraints> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       </rowConstraints> 
      </GridPane> 
     </center> 
     <bottom> 
      <HBox alignment="CENTER" prefHeight="40.0" prefWidth="747.0" BorderPane.alignment="CENTER"> 
       <children> 
        <FlowPane prefHeight="200.0" prefWidth="200.0"> 
        <children> 
         <Button fx:id="loadButton" alignment="CENTER" contentDisplay="CENTER" minHeight="-Infinity" minWidth="-Infinity" onAction="#setGrid" prefHeight="35.0" prefWidth="100.0" text="Load Board" /> 
          <Button fx:id="solveButton" alignment="CENTER" contentDisplay="CENTER" minHeight="-Infinity" minWidth="-Infinity" onAction="#sudokuSolve" prefHeight="35.0" prefWidth="100.0" text="Solve" /> 
        </children> 
        </FlowPane> 
       </children> 
      </HBox> 
     </bottom> 
     </BorderPane> 
    </children> 
</AnchorPane> 
+0

So offensichtlich 'gridPane' ist null. Vielleicht posten Sie die FXML-Datei? –

+0

@James_D Ich habe aktualisiert. Könnten Sie mir auch mitteilen, ob das Aktualisieren der Frage Personen benachrichtigt, die kommentiert haben? So kann ich sinnlose Tags/Kommentare vermeiden. – Raitab

+0

Nein, es gibt keine automatischen Benachrichtigungen für eine Bearbeitung einer Frage (außer Benachrichtigungen, wenn jemand anders Ihre Frage oder Antwort bearbeitet). –

Antwort

2

Versuchen Sie, die javafx.fxml.Initializable Schnittstelle in Ihr Controller und verschieben Sie die setGrid() Logik auf die Methode, die damit einhergeht.

+5

Sie müssen 'Initializable' nicht implementieren (seit JavaFX 2.1). Definieren Sie einfach eine Methode 'public void initialize()', sie wird automatisch durch Reflektion aufgerufen. –

+0

Das Initialisieren ist etwas, was ich vorher versucht habe. Ich habe es erneut aus Sicherheitsgründen versucht und es funktioniert nicht. Ich könnte den Fehler bei der Kompilierung posten, aber es ist sehr lang. Es scheint eine Reflection-, Loader- und Nullzeiger-Ausnahme zu geben, aber keine zeigt direkt auf meinen Code. – Raitab

+0

@Raitab Bearbeiten Sie Ihre Frage so, dass Sie versuchen, 'initialize()' und den kompletten Stack-Trace zu verwenden. Ich nehme an, wenn Sie null Zeigerausnahmen erhielten, lesen Sie https://stackoverflow.com/questions/218384/what-isa-nullpointerexception-and-how-do-ifix-it und versuchten, sie zu beheben. –

Verwandte Themen