2012-07-19 13 views
17

Ich versuche, ein Skelett für eine große komplexe GUI zu erstellen, so ist die Idee, alles mit MVC wie Stil in javafx 2.1 zu machen, so dass jede Komponente eine fxml hat Datei und bei Bedarf CSS, Controller und Modell. Ich versuche herauszufinden, wie man Subszenen (Subfxml zur Laufzeit) ändert. Jeder weiß, wie es geht? Ich bleibe irgendwie dabei. Darf man MainViewController hinzufügen? Szenario: Benutzer klickt auf die Schaltfläche in der Taskleiste und die darin enthaltene content1.fxml wird mit content2.fxmlWie man sub fxml gui Teile zur Laufzeit mit Button klicken

hier die grundlegenden Code

MainApp.java

Loads the MainView.fxml 

MainView.fxml ersetzt werden

<?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 Bild für meine gewünschte Funktion http://www.alsphera.com/enter/howtodoit.png – Snow

Antwort

17

Nicht nur sind fxml, erstellen Sie eine Schicht Business-Logik für das:

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

und aktualisieren Sie es in Schaltfläche klicken Handler:

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

Ich wollte es vorzuschlagen. Sie können sogar über Ihre Kinder iterieren und ersetzen Sie eine mit seiner ID, wenn das der Fall ist –

+3

dies sollte gut funktionieren, wenn alles in MainViewController gestellt wurde, aber ich möchte Modularität zu erhalten, wie kann ich von TaskBarController erhalten, die an TaskBar.fxml angehängt ist der Zugang zum Elternknoten? wäre das BorderPane von MainView.fxml, und dann könnte ich die geladene content2.fxml an die Mitte der Boarderpane anhängen – Snow

2

es funktioniert , thx für Hilfe, aber ich war gezwungen, TaskBar.fxml und TaskBarController.java zu entfernen, schrieb einen MainViewController mit @FXML-Handles und @FXML für die Buttons und den Bereich mit dem fx: id = "content", und legte meine Gewohnheiten Buttons in 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"))); 
}