2013-06-23 38 views
4

在我的FXML中,我创建了一个gridpane。现在我想通过java代码(不是FXML)添加动态元素(如按钮,文本框) ,而我试图这样做,我得到错误。请帮忙。JAVAFX在FXML Gridpane中添加动态元素

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

我的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(); 
} 
} 

回答

11

你得到一个空指针,因为你尝试stage.show之前做手术(),所以FXML尚未初始化。不做脏东西,把一个单独的控制器

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); 
    } 
} 

您greadPane.add并分配FXML这个CONTROLER。这将是好的

+0

感谢它帮助:) – Arijit

+0

不要忘记标记答案,解决话题 –

0

我遇到了同样的问题,并使用Agonist_的建议,但不是将gridPane分离成一个新的控制器,我只是创建了一个线程,运行10ms后执行代码,它正在等待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(); 
} 

在这个例子中当执行game.startBeginnerRound()时可观察到的通知它,在这种情况下,gridPane被更新。