2013-06-23 7 views
4

Dans mon FXML, j'ai créé une grille. Maintenant, je veux ajouter un élément dynamique (bouton Like, champ de texte) par le code java (pas par FXML), alors que j'essaie de le faire, je reçois erreur. S'il vous plaît aidez.JAVAFX ajoute un élément dynamique dans un Gridpane FXML

mon FXML:

<AnchorPane fx:controller="tableview.TableViewSample" id="AnchorPane" maxHeight="-  Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml"> 
    <children> 
    <GridPane fx:id="greadpane" layoutX="0.0" layoutY="0.0" prefHeight="400.0" prefWidth="600.0"> 
     <columnConstraints> 
     <ColumnConstraints fx:id="col0" hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
     <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
     </columnConstraints> 
     <rowConstraints> 
     <RowConstraints fx:id="row0" 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> 
    </children> 
    </AnchorPane> 

Mon code Java:

public class TableViewSample extends Application { 

    @FXML private GridPane greadpane; 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) throws IOException { 

     Pane myPane = (Pane)FXMLLoader.load(getClass().getResource 
       ("tabviewexamlpe.fxml")); 
     Scene scene = new Scene(myPane); 
     stage.setTitle("Table View "); 
     stage.setWidth(450); 
     stage.setHeight(500); 
     stage.setScene(scene);  

     final Label label = new Label("Address Book"); 
     label.setFont(new Font("Arial", 20)); 
     greadpane.add(label, 0, 0); 
     stage.show(); 
} 
} 

Répondre

11

Vous obtenez un pointeur NULL parce que vous essayez de le faire avant l'opération stage.show() si FXML ne sont pas encore initialisés. ne pas faire des choses sales et mettre vos greadPane.add sur un contrôleur séparé

public class Controller implements Initializable { 

    @FXML 
    private GridPane greadpane; 

    @Override 
    public void initialize(URL url, ResourceBundle resourceBundle) { 
     final Label label = new Label("Address Book"); 
     label.setFont(new Font("Arial", 20)); 
     greadpane.add(label, 0, 0); 
    } 
} 

et affecter votre FXML à ce controleur. et ça va bien se passer

+0

Merci, il a aidé :) – Arijit

+0

ne pas oublier de marquer la réponse, pour résoudre le sujet –

0

J'ai rencontré le même problème et j'ai utilisé le conseil d'Agonist, mais au lieu de séparer le gridPane dans un nouveau contrôleur j'ai juste créé un thread qui court 10ms plus tard pour exécuter le code qui attend le stage.show().

public GameController(Game game) { 
    game.addObserver(this); 
    new Thread() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(10); 
       Platform.runLater(() -> { 
        game.startBeginnerRound(); 
       }); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(GameController.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }.start(); 
} 

Dans cet exemple, le gridPane est mis à jour lorsque l'observable notifie, dans ce cas, lorsque game.startBeginnerRound() est exécutée.

Questions connexes