2015-10-28 138 views
0

我試圖加載FXML和使用Java代碼(不與FXML標籤)設置控制器。我在FXML中有不同的字段。我試圖加載(例如文本框,按鈕...)。的JavaFX - 如何FXML控制器在設定值初始化

這裏是例子:

Tab tab = new Tab(); 
tab.setText("TesetTabAdd"); 
tabpane.getTabs().add(tab); 
FXMLLoader loader = new FXMLLoader(getClass().getResource("tab.fxml")); 
TabController tabCont = new TabController(); 
tabCont.setName("Sandro"); 
loader.setController(tabCont); 
try { 
    tab.setContent((Node)loader.load(getClass().getResource("tab.fxml"))); 
} catch (IOException ex) { 
    System.out.println(ex); 
} 

正如你可以看到我創建一個新的選項卡,設置它,將它添加到tabpane,加載FXML,然後創建一個新的控制器和設置文本它作爲FXML的控制器。在此之後,我嘗試在初始化之前在fxml中設置一個值,以便我可以在控制器中使用它來更新文本字段或按鈕。

這裏是我的控制,我試圖設置:

public class TabController implements Initializable { 

    @FXML private TextField name; 
    private final StringProperty nameProp = new SimpleStringProperty(); 

    public String getNameProp() { 
     return nameProp.get(); 
    } 

    public void setNameProp(String value) { 
     nameProp.set(value); 
    } 

    public StringProperty namePropProperty() { 
     return nameProp; 
    } 

    public void setName(String name){ 
     nameProp.setValue(name); 
    } 

    public String getName(){ 
     return nameProp.get(); 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     name.textProperty().bind(nameProp); 
    }  
} 

我結合嘗試過,但它不工作。

修改我的CREATETAB()方法LITTEL位。在這裏我設置控制器,然後使用setName方法。但我textfield不顯示任何東西。 System.out.println(tabCont.getName());方法打印出「Sandro」!

public void createTab(){ 
     try{ 
     Tab tab = new Tab(); 
     tab.setText("TesetTabAdd"); 
     tabpane.getTabs().add(tab); 
     FXMLLoader loader = new FXMLLoader(); 
     TabController tabCont = new TabController(); 
     loader.setController(tabCont); 
     tabCont.setName("Sandro"); 
     tab.setContent((Node)loader.load(getClass().getResource("tab.fxml"))); 
     System.out.println(tabCont.getName()); 
     } catch (IOException ex) { 
      System.out.println(ex); 
     } 
    } 

回答

3

1)FXML文件未加載,直到load()方法被調用。
(根據您的評論「... load the fxml and then I create a new controller ...」)。所以只要啓動FXMLLoader就不會加載給定的fxml文件。

2)要調用一個錯誤的加載方法。您應該使用實例化的FXMLLoader的加載方法。但是你使用了FXMLLoader類的靜態加載方法。該靜態版本將忽略通過setController()設置的控制器類。嘗試:

FXMLLoader loader = new FXMLLoader(getClass().getResource("tab.fxml")); 
TabController tabCont = new TabController(); 
tabCont.setName("Sandro"); 
loader.setController(tabCont); 
try { 
    tab.setContent((Node) loader.load()); 
} catch (IOException ex) { 
    System.out.println(ex); 
} 
+0

謝謝。是的,這是完美的。你能告訴我你在哪裏找到這些信息嗎?在JavaFX API中?我覺得如此愚蠢以至於問一些這樣的簡單問題,而且我的自己並沒有得到正確的答案。 !; – Steinliiippp

+0

@Steinliiippp,不幸的是我自己的經驗..) –

+0

哦~~好:(感謝您的幫助 – Steinliiippp