2013-06-23 37 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被更新。