2015-09-22 47 views
0

我在JavaFX中進行根修改時遇到了問題。需要關於getChildrenUnmodifiable的解釋

一個類加載一個FXML並創建一個場景,但我不能使用getChildren()函數,這裏只有getChildrenUnmodifiable()

login.fxml中的第一個容器是StackPane,也許StackPane不支持它,就像一些控件?

我可能誤解了JavaFX的工作原理。

我創建了一個測試應用程序,看看其他類我的項目是造成問題的原因:

@Override 
public void start(Stage primaryStage) throws Exception { 
    Parent rootScene = FXMLLoader.load(getClass().getResource("login.fxml")); 
    Scene scene = new Scene(rootScene, 900, 500); 
    //rootScene.getChildrenUnmodifiable() 
} 

有人能解釋爲什麼嗎?

回答

2

正如在其他答案中指出的,Parent.getChildren()protected方法。然而,它在StackPane(事實上在Pane,因此對於所有Pane子類都是如此)並且可見性被擴大到public

所以,既然你FXML的根源實際上是一個StackPane,所有你需要做的是改變root編譯時類型:

@Override 
public void start(Stage primaryStage) throws Exception { 
    StackPane rootScene = FXMLLoader.load(getClass().getResource("login.fxml")); 
    rootScene.getChildren().add(...); 
    Scene scene = new Scene(rootScene, 900, 500); 
} 
+0

感謝您除了提供代碼samplet回答。 – Catch44

0

Parent.getChildren()protected方法;爲了調用它,您的代碼必須是Parent的子類或與Parent相同的包。顯然這是爲了防止客戶端代碼能夠直接更改子集合。

但是,正如@James_D的回答所示,有Parent的子類確實有public版本的getChildren()。例如,Pane類(並且StackPanePane的子類)。如果您所有的孩子都是Pane的子類,則可以用Pane代替代碼中的Parent