2015-07-14 4 views
0

У меня есть два vbox (ы).Скопируйте данные fxml в другой контейнер

Первый VBox FX: идентификатор vbox1

Второй VBox Fx: идентификатор vbox2

В vbox1 я имеющим текстовое поле, выпадающий, кнопки и все остальное.

У меня есть одна кнопка, которая хочет копия (onclick) весь источник/fxml от vbox1 до vbox2.

Есть ли все-таки сделать это?

ответ

0

Определить содержимое VBox es в отдельном файле FXML. Вы можете включить содержимое в первую VBox непосредственно в «главном» FXML с <fx:include>:

<VBox fx:id="vbox1"> 
    <fx:include source="Content.fxml"/> 
</VBox> 

, а затем вы можете загрузить другую копию в обработчик кнопки с

@FXML 
public void handleButtonAction(ActionEvent e) throws Exception { 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("Content.fxml")); 
    vbox2.getChildren().add(loader.load()); 
} 

Полный пример (все в пакете с именем application):

Main.fxml:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.layout.BorderPane?> 
<?import javafx.scene.layout.HBox?> 
<?import javafx.scene.layout.VBox?> 
<?import javafx.scene.control.Button?> 

<BorderPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainController"> 
    <center> 
     <HBox spacing="5"> 
      <VBox fx:id="vbox1"> 
       <fx:include source="Content.fxml"/> 
      </VBox> 
      <VBox fx:id="vbox2"/> 
     </HBox> 
    </center> 
    <bottom> 
     <Button text="Load" onAction="#load" BorderPane.alignment="CENTER"/> 
    </bottom> 
</BorderPane> 

MainController.java:

package application; 

import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.layout.VBox; 

public class MainController { 
    @FXML 
    private VBox vbox1 ; 
    @FXML 
    private VBox vbox2 ; 
    @FXML 
    private void load() throws Exception { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("Content.fxml")); 
     vbox2.getChildren().add(loader.load()); 
    } 
} 

Content.fxml:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.layout.VBox?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.control.ComboBox?> 
<?import javafx.collections.FXCollections?> 

<?import java.lang.String?> 
<?import javafx.scene.control.Button?> 

<VBox xmlns:fx="http://javafx.com/fxml/1"> 
    <TextField promptText="Text Field"/> 
    <ComboBox> 
     <items> 
      <FXCollections fx:factory="observableArrayList"> 
       <String fx:value="One"/> 
       <String fx:value="Two"/> 
       <String fx:value="Three"/> 
      </FXCollections> 
     </items> 
    </ComboBox> 
    <Button text="Click me"/> 
</VBox> 

Main.java:

package application; 

import javafx.application.Application; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.layout.BorderPane; 
import javafx.fxml.FXMLLoader; 


public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     try { 
      BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("Main.fxml")); 
      Scene scene = new Scene(root,400,400); 
      scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
}