2017-07-27 446 views
0

我可以將Node的父母更改爲FXML中的其他父母嗎?如何將孩子fxml的父母換成其他父母?

假設一個父節點stackcon與一個子節點。 我現在要將此子節點移動到不同的父級,例如名爲stackmain

這可能嗎?如果是,請給我一個鏈接或示例代碼。

+0

所以,基本上,你要移動從一個'Parent'到另一個'Parent'的某個'Node',即將它從第一個'Parent'中移除並添加到第二個'Parent'中? –

+0

@ MarkusWeninger是的,但我不知道如何做到這一點,以及明確的父母,我想加載該子fxmll文件 – Rocky

+0

我添加了答案。這是你想要的嗎? –

回答

0

這只是如何做到這一點的許多方法之一。

MainView.fxml,只是一個簡單的視圖含有一個按鈕,上按鈕點擊標籤應從右到左和反之亦然被移動(見onMousePressed聲明):

<fx:root type="BorderPane" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1"> 
    <left> 
     <VBox fx:id="lefty"> 
      <Label fx:id="switchy" text="Switching text"></Label> 
     </VBox> 
    </left> 
    <center> 
     <Button fx:id="switchBtn" text="Switch" onMousePressed="#switchButtonPressed"></Button> 
    </center> 
    <right> 
     <VBox fx:id="righty"> 
     </VBox> 
    </right> 
</fx:root> 

控制器MainView.javaswitchButtonPressed事件處理

public class MainView extends BorderPane { 
    @FXML private VBox lefty; 
    @FXML private VBox righty; 
    @FXML private Label switchy; 

    public MainView() { 
     URL fxmlFile = MainView.class.getResource("MainView.fxml"); 
     FXMLLoader fxmlLoader = new FXMLLoader(fxmlFile); 
     fxmlLoader.setRoot(this); 
     fxmlLoader.setController(this); 

     try { 
      fxmlLoader.load(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void switchButtonPressed(MouseEvent mouseEvent) { 
     if(lefty.getChildren().contains(switchy)) { 
      lefty.getChildren().remove(switchy); 
      righty.getChildren().add(switchy); 
     } else { 
      righty.getChildren().remove(switchy); 
      lefty.getChildren().add(switchy); 
     } 
    } 
} 

您會看到,如果標籤位於左側,我只需點擊按鈕即可。如果是這樣,請將其在左側移除並將其添加到右側。 類似的,如果它在右側,將其移除並將其添加到左側。

+0

https://stackoverflow.com/questions/45318424/child-fxml-file-not-loading-to-parent-fxml/45320747#45320747其實我想爲這個問題的解決方案 – Rocky

+0

@Rocky:是的,然後採取邏輯我提出,這對你的問題是完全正確的。只是,不是按下按鈕,在您的問題中,事件處理程序必須註冊到事件「當用戶單擊表格行時」。如果這個答案對你有幫助,請注意它(並接受它作爲答案)。 –

+0

你正在切換到單父fxml視圖(即stackpane是常見的),但在我的情況下,有超級父窗格,父窗格和子窗體。孩子得到加載到父窗格沒有問題,但當我試圖加載到超級父窗格它的拋出錯誤stackhome.getChildren()。clear(); 。stackhome.getChildren()加( 「an.fxml」); stackhome是超級父母堆棧 – Rocky

1

它可以根據類型的stackmain & stackcon窗格中,我假設你使用AnchorPane

有所不同,但它是這樣的

Node childNode = stackcon.getChildren().get(indexOfChild); 
stackcon.getChildren().remove(indexOfChild); 
stackmain.getChildren().add(childNode);