2012-07-19 11 views
17

Sto provando a creare uno scheletro per un gui complesso, quindi l'idea è di creare tutto con lo stile mvc in javafx 2.1, quindi ogni componente ha un fxml file e se necessario css, controller e modello. Sto cercando di capire come modificare le scene secondarie (sub fxml in fase di esecuzione). Qualcuno sa come farlo? Sono piuttosto bloccato su questo. Potrebbe essere necessario aggiungere MainViewController? scenario: utente fa clic sul pulsante nella barra delle applicazioni e il content1.fxml incluso sarà sostituito con content2.fxmlCome cambiare parti sub fxml gui in fase di esecuzione con il pulsante Click

qui il codice di base

MainApp.java

Loads the MainView.fxml 

MainView.fxml

<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 


<BorderPane xmlns:fx="http://javafx.com/fxml"> 
<center> 
    <fx:include source="Content1.fxml"/> 
</center> 

<bottom> 
    <fx:include source="TaskBar.fxml"/> 
</bottom> 

</BorderPane> 

Content1.fxml

<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<StackPane xmlns:fx="http://javafx.com/fxml" fx:id="content1"> 
    <Label text="Hallo Java FX 2.1.1 Content1.fxml"/> 
</StackPane> 

Content2.fxml

<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<StackPane xmlns:fx="http://javafx.com/fxml" fx:id="content2"> 
    <Label text="Hallo Java FX 2.1.1 Content2.fxml"/> 
</StackPane> 

TaskBar.fxml

<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<HBox xmlns:fx="http://javafx.com/fxml" spacing="10" alignment="center" 
    fx:id="taskBar" fx:controller="TaskBarController"> 
    <children> 
     <Button fx:id="taskBarButton1" onAction="#handleTaskBarButton1Action"/>  
     <Button fx:id="taskBarButton2" onAction="#handleTaskBarButton2Action"/> 
    </children> 
</HBox> 

TaskBarCont roller.java

import java.net.URL; 
import java.util.ResourceBundle; 

import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 

public class TaskBarController implements Initializable { 

// Binding with the FXML 
@FXML 
private Button taskBarButton1; 

@FXML 
private Button taskBarButton2; 

@FXML 
private void handleTaskBarButton1Action(ActionEvent event) { 
    System.out.println("click! taskBarButton1"); 
} 

@FXML 
private void handleTaskBarButton2Action(ActionEvent event) { 
    System.out.println("click! taskBarButton2"); 
} 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    // TODO Auto-generated method stub 

} 

} 
+0

hier Immagine per il mio http://www.alsphera.com/enter/howtodoit.png funktion desiderato – Snow

risposta

17

Non solo includere fxml, creare un livello di logica di business per questo:

<BorderPane xmlns:fx="http://javafx.com/fxml"> 
<center> 
    <Pane fx:id="content"/> 
</center> 

e aggiornarlo in scatto del tasto gestori:

@FXML 
private void handleTaskBarButton2Action(ActionEvent event) { 
    System.out.println("click! taskBarButton2"); 
    content.getChildren().clear(); 
    content.getChildren().add(FXMLLoader.load(getClass().getResource("Content2.fxml")); 
} 
+0

stavo per suggerirlo. Puoi anche scorrere i tuoi figli e sostituirne uno usando il suo id se questo è il caso –

+3

questo schould funziona bene se tutto è stato messo in MainViewController, ma voglio mantenere la modularità, come posso ottenere da TaskBarController che è collegato a TaskBar.fxml l'accesso al nodo genitore? sarebbe il BorderPane da MainView.fxml, e che potrei collegare il content2.fxml caricato al centro del boarderpane – Snow

2

funziona , per aiuto, ma sono stato costretto a rimuovere TaskBar.fxml e TaskBarController.java, ho scritto un MainViewController con handle @FXML e @FXML per i pulsanti e il pannello con fx: id = "content", e metto i miei pulsanti doganali MainView.fxml

@FXML 
private void handleTaskBarButton2Action(ActionEvent event) throws IOException { 
    System.out.println("click! taskBarButton2"); 
    content.getChildren().clear(); 
    content.getChildren().add((Node) FXMLLoader.load(getClass().getResource("Content2.fxml"))); 
} 
Problemi correlati