2017-10-03 10 views
-1

J'ai créé un 9x9 GridPane dans SceneBuilder, et je souhaite ajouter TextFields à chaque cellule. Je suis certain qu'il existe d'autres méthodes pour créer une grande table comme celle-ci, mais je ne cherche pas une autre façon de le faire (cela fait partie de mon expérience d'apprentissage). Je ne veux pas ajouter TextFields dans FXML/SceneBuilder; Je veux garder une trace d'eux dans un tableau afin que je puisse accéder à leurs valeurs individuelles, donc je veux les créer un à la fois dans le contrôleur, puis les ajouter à la matrice ainsi qu'à chaque cellule du GridPane.Création d'une scène en utilisant à la fois FXML et le contrôleur dans JavaFX

Voici la partie de mon contrôleur qui tente d'ajouter TextFields (je les ai essayé de créer avant de les ajouter au tableau):

@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!"); 
     } 
    } 
} 

Je ne reçois pas d'erreur avant l'exécution et la scène n'est pas actualisé.

EDIT: Je l'ai regardé l'StackTrace et a remarqué que je reçois un pointeur nul à

gridPane.add(tempTextField,i,j); 

FXML fichier:

<?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

Donc, évidemment, 'gridPane' est nul. Peut-être poster le fichier FXML? –

+0

@James_D J'ai mis à jour. Aussi, pourriez-vous me faire savoir si la mise à jour de la question informe les personnes qui ont commenté. De cette façon, je peux éviter les tags/commentaires inutiles comme celui-ci. – Raitab

+0

Non, il n'y a pas de notifications automatiques pour une modification à une question (autre que les notifications si quelqu'un d'autre édite votre question ou votre réponse). –

Répondre

2

Essayez implémentant l'interface javafx.fxml.Initializable dans votre contrôleur et déplacez la logique setGrid() vers la méthode qui l'accompagne.

+5

Vous n'avez pas besoin d'implémenter 'Initializable' (depuis JavaFX 2.1). Définissez simplement une méthode 'public void initialize()', elle sera invoquée automatiquement par réflexion. –

+0

Déplacer pour initialiser est quelque chose que j'avais déjà essayé. Je l'ai essayé encore pour la certitude et cela ne fonctionne pas. Je pourrais poster l'erreur donnée lors de la compilation, mais c'est très long. Il semble qu'il y ait des exceptions Reflection, Loader et Null Pointer, mais aucune ne pointe directement sur mon code. – Raitab

+0

@Raitab Modifiez votre question pour inclure votre tentative d'utiliser 'initialize()' et la trace complète de la pile. Je suppose que si vous avez des exceptions de pointeur nul, vous lisez https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it et essayé de les corriger. –