2017-01-29 26 views
1

Как создать 5-кратную идентичную TabPane с SceneBuilder, без 5-кратной работы?JavaFX: Как создать 5x идентичных вкладок в TabPane с помощью SceneBuilder, без работы 5x?

  • одно окно содержит 5 одинаковых TabPane с очень многими и сложными GUI компонентов
  • Я хотел бы также использовать SceneBuilder для дизайна/вкладки окна
  • Как я могу избежать необходимости разрабатывать 5x идентичны TabPane-й с SceneBuilder, хотя только FX: идентификатор и обрабатывать методы немного отличается от имени, например:
    TabPane0: tab0_textField_inputValue
    TabPane1: tab1_textField_inputValue
    TabPane2: tab2_textField_inputValue
    т.д.

Решение:

  • просто дизайн TabPane с SceneBuilder
  • , но как вы можете продублировать этот "мастер" -TabPane еще 4x, в результате чего имена переменной/метод адаптированы соответственно автоматически?
  • дубликат должен быть автоматическим, потому что мне это нужно очень часто (после каждого шага GUI развития или коррекций/настроек на вкладке «мастер»)
  • Есть ли возможно уже инструмент, который расширяет файл FXML автоматически соответствующим образом?

ответ

2

Вы обычно создают FXML, содержащий только один TabPane и использовать этот FXML несколько раз с помощью <fx:include>:

tabpane.fxml

<TabPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="mapackage.TabPaneController"> 
    ... 
</TabPane> 

Содержит макет

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="mapackage.RootController"> 
    <children> 
     <fx:include fx:id="tabPane1" source="@tabpane.fxml" /> 
     <fx:include fx:id="tabPane2" source="@tabpane.fxml" /> 
     ... 
    </children> 
</VBox> 
public class RootController { 
    @FXML 
    private TabPaneController tabPane1Controller; 
    @FXML 
    private TabPaneController tabPane2Controller; 
    ... 
} 

Конечно, вы должны убедиться, что TabPaneController содержит соответствующие методы для получения доступа к функции, необходимые для доступа из RootController ...

+0

Спасибо. Вместо 'source = "@ tabpane.fxml"' это может быть лучше 'source = "tabpane.fxml"' для использования. – Sten

0

Решение:
Спасибо за вашу помощь. Мое решение выглядит следующим образом:
- Я использую TabView.fxml несколько раз для ввода
- каждая вкладка должны быть назначены уникальной табетической как только пользователь нажмет на вкладке
- следующий код завершения и работа

Main.java

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Scene scene = new Scene(new AnchorPane()); 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("tabPaneRootView.fxml")); 
     scene.setRoot(loader.load()); 
     TabPaneRootController controller = loader.getController(); 
     controller.myInit(); //my init-Methode 
     primaryStage.setScene(scene); 
     primaryStage.setTitle("I'm Tab x"); 
     primaryStage.show(); 
    } 

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

TabPaneRootController.java

public class TabPaneRootController {  
    @FXML private TabPane tabPane; 

    //################################# Inject SubController ################################## 
    //Inject tab controller 
    @FXML private TabController xxx_tab1_xxxController; //TabPaneRootView.fxml_include_fx:id="xxx_tab_xxx" + "Controller" 
    @FXML private TabController xxx_tab2_xxxController; 
    //######################################################################################### 

    public void myInit() {  
     tabPane.getSelectionModel().selectedItemProperty().addListener((ObservableValue<? extends Tab> observable, 
       Tab oldValue, Tab newValue)->{ 
        preparationInitTab(newValue);     
       }); 
    } 

    public void preparationInitTab(Tab selectedTab) { 
     String currentTabId_string = selectedTab.getId(); 
     String[] parts = currentTabId_string.split("_"); 
     int currentTabId = Integer.parseInt(parts[1]); 

     switch(currentTabId) { 
     case 1: 
      xxx_tab1_xxxController.initTab(currentTabId); 
      break; 
     case 2: 
      xxx_tab2_xxxController.initTab(currentTabId); 
      break; 

     default: 
      System.out.println("Warning: Select an unassigned tab='" + currentTabId + "'"); 
     } 
    }  
} 

TabController.Java

public class TabController {  
    private int tabId = -9; //is the ID of the currently selected tab 

    @FXML private TextField tab_textField_currentTabName; 
    @FXML private TextField tab_textField01_costPosition1; 

    public void initTab(int currentTabId) { 
     System.out.println(">TabController::initTab() with currentTabId=" + currentTabId); 
     this.tabId = currentTabId;  
     tab_textField_currentTabName.setText(String.valueOf(tabId)); 
    } 

    //----------------- FXML-Methoden --------------------------  
    @FXML 
    private void handleTabTextFieldCostPosition1() { 
     System.out.println("costPosition1[" + tabId + "]=" + tab_textField01_costPosition1.getText()); 
    } 

    @FXML 
    private void handleExit() {  
     Platform.exit(); 
    } 
} 

tabPaneRootView.fxml

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

<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.Tab?> 
<?import javafx.scene.control.TabPane?> 
<?import javafx.scene.layout.AnchorPane?> 

<AnchorPane xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.myapp.TabPaneRootController"> 
    <children> 
     <TabPane fx:id="tabPane" tabClosingPolicy="UNAVAILABLE"> 
     <tabs> 
      <Tab fx:id="tabId_0" text="Tab0"> 
       <content> 
        <AnchorPane prefHeight="200.0" prefWidth="200.0"> 
        <children> 
         <Label layoutX="10.0" layoutY="30.0" text="general information ..." /> 
        </children> 
        </AnchorPane> 
       </content> 
      </Tab> 
      <Tab fx:id="tabId_1" text="Tab1"> 
       <content> 
        <fx:include source="tabView.fxml" fx:id="xxx_tab1_xxx" /> 
       </content> 
      </Tab> 
      <Tab fx:id="tabId_2" text="Tab2"> 
       <content> 
        <fx:include source="tabView.fxml" fx:id="xxx_tab2_xxx" />    
       </content> 
      </Tab> 
     </tabs> 
     </TabPane> 
    </children> 
</AnchorPane> 

tabView.fxml

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

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.layout.AnchorPane?> 

<AnchorPane prefHeight="200.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.myapp.TabController"> 
    <children> 
     <Label layoutX="10.0" layoutY="40.0" text="I'm Tab Index:"> </Label> 
     <TextField fx:id="tab_textField_currentTabName" editable="false" layoutX="107.0" layoutY="35.0" prefWidth="30.0" /> 
     <Button alignment="CENTER" contentDisplay="CENTER" layoutX="185.0" mnemonicParsing="false" onAction="#handleExit" text="Exit" AnchorPane.bottomAnchor="10.0"> </Button> 
     <Label layoutX="10.0" layoutY="90.0" text="costPosition1 in € =" /> 
     <TextField fx:id="tab_textField01_costPosition1" alignment="CENTER_RIGHT" layoutX="150.0" layoutY="85.0" onKeyReleased="#handleTabTextFieldCostPosition1" prefWidth="150.0" promptText="input an int value" /> 
    </children> 
</AnchorPane> 

- Directory structure
- Example started

 Смежные вопросы

  • Нет связанных вопросов^_^