2017-07-27 5 views
0

Puis-je changer un parent de » Node à un autre parent dans FXML?Comment changer le parent de l'enfant fxml en un autre parent?

Supposons un parent nommé stackcon avec un nœud enfant. Je veux maintenant déplacer ce nœud enfant vers un parent différent, par exemple, nommé stackmain.

Est-ce possible? Si oui, donnez-moi un lien ou un exemple de code.

+0

Donc, en gros, vous voulez déplacer un certain 'Node' d'un 'Parent' à un autre' Parent', c'est-à-dire, le retirer dans le premier 'Parent' et l'ajouter au second' Parent'? –

+0

@MarkusWeninger oui, mais je n'ai aucune idée comment faire aussi bien que clair que parent où je veux charger cet enfant fxmll fichier – Rocky

+0

J'ai ajouté une réponse. c'est ce que tu veux? –

Répondre

0

Ceci est juste l'une des nombreuses façons comment faire cela.

MainView.fxml, un simple vue contenant un bouton, et cliquez sur le bouton l'étiquette doit être déplacé de droite à gauche et vice-versa (voir la déclaration 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> 

Le contrôleur MainView.java avec son gestionnaire d'événements switchButtonPressed:

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

Vous voyez, je vérifie simplement sur le bouton cliquez si l'étiquette est sur le côté gauche. Si c'est le cas, retirez-le sur le côté gauche et ajoutez-le sur le côté droit. Analogue, si c'est sur le côté droit, retirez-le et ajoutez-le sur le côté gauche.

+0

https://stackoverflow.com/questions/45318424/child-fxml-file-not-loading-to-parent-fxml/45320747#45320747 en fait je veux une solution pour cette question – Rocky

+0

@Rocky: Oui, puis prendre la logique I présenté, il est totalement parfait pour votre problème. Juste, au lieu d'appuyer sur un bouton, dans votre problème, le gestionnaire d'événements doit être enregistré dans l'événement "lorsque l'utilisateur clique sur la ligne du tableau". Si cette réponse vous a aidé, veuillez l'augmenter (et l'accepter comme réponse). –

+0

vous passez d'une vue parent unique fxml (c'est-à-dire que la pilepane est commune) mais dans mon cas, il y a un volet superparent, un volet parent et un enfant. l'enfant se charge dans le volet parent sans problème, mais quand j'essaie de le charger dans le volet super parent son erreur de lancement stackhome.getChildren(). clear(); stackhome.getChildren(). add ("an.fxml"); stackhome est super stack parent – Rocky

1

il peut varier selon le type du volet de stackmain & stackcon, je suppose que vous utilisez AnchorPane

mais il est quelque chose comme ça

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