2016-10-20 2 views
2
<TabPane fx:controller="application.FXMLcontrolor" prefHeight="400.0" prefWidth="600.0" tabClosingPolicy="ALL_TABS" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.65"> 
    <tabs> 
    <Tab text="Untitled Tab 1"> 
     <content> 
     <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> 
     </content> 
    </Tab> 
    <Tab text="Untitled Tab 2"> 
     <content> 
     <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> 
     </content> 
    </Tab> 
    </tabs> 
</TabPane> 

и контроллер, как этотПочему этот код не создает панель вкладок?

public class FXMLcontrolor extends TabPane 
{ 

    public FXMLcontrolor() 
    { 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("FXMLdocument.fxml")); 
     fxmlLoader.setRoot(this); 
     fxmlLoader.setController(this); 

     try 
     { 
      fxmlLoader.load(); 
     } 
     catch (IOException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
} 

и главное, как это:

public class Main extends Application 
{ 
    @Override 
    public void start(Stage stage) throws IOException 
    { 

     FXMLcontrolor mainControllor=new FXMLcontrolor(); 

     stage.setScene(new Scene(mainControllor)); 
     stage.setTitle("Custom Control"); 
     stage.setWidth(400); 
     stage.setHeight(400); 
     stage.show(); 
    } 

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

и результат не имеет вкладки в нем, почему это не показывает вкладку? Я использовал FXML для создания пользовательского интерфейса и контролера, что я должен делать? Infact, я ищу способ управления областью вкладок с несколькими вкладками и несколькими элементами управления в каждом из них, но даже при реализации этого простого примера у меня проблема.

enter image description here

+0

Это даже не компилируется для меня. –

+0

Вы всегда должны включать трассировку стека (исключение), которую вы задаете в вопросе. –

ответ

2

Если вы устанавливаете корень динамически

fxmlLoader.setRoot(...); 

вам нужно использовать <fx:root> элемент в качестве корневого элемента FXML. См. documentation.

Кроме того, если установить контроллер в коде с

fxmlLoader.setController(...); 

вы должны не указать атрибут fx:controller в файле FXML. Таким образом, ваш файл FXML должен быть

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

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

<fx:root type="TabPane" prefHeight="400.0" prefWidth="600.0" tabClosingPolicy="ALL_TABS" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.65"> 
    <tabs> 
    <Tab text="Untitled Tab 1"> 
     <content> 
     <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> 
     </content> 
    </Tab> 
    <Tab text="Untitled Tab 2"> 
     <content> 
     <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" /> 
     </content> 
    </Tab> 
    </tabs> 
</fx:root> 
+0

это работает, но я вижу вашу ссылку, что означают эти предложения: – delsa

+1

Методы setRoot() и setController() для FXMLLoader позволяют вызывающему пользователю вводить корневые файлы и значения контроллера соответственно в пространство имен документов, а не делегировать создание эти значения для самого FXMLLoader. Это позволяет разработчику легко создавать элементы многократного использования, которые внутренне реализованы с использованием разметки, но (с точки зрения API) идентичны элементам управления, реализованным программно. – delsa

+0

@delsa Они имеют в виду именно то, что они говорят: не уверен, что я могу многое прояснить. Если вы вызываете 'setRoot (..)' корневой элемент указан кодом Java, не созданным 'FXMLLoader' в соответствии с корневым элементом файла FXML. Поэтому нет смысла указывать класс как корень FXML; вместо этого вы используете '''. Аналогично, 'setController (...)' задает контроллер. Если вы укажете контроллер, он не будет создан «FXMLLoader», поэтому нет смысла инструктировать «FXMLLoader» для его создания, что и делает атрибут 'fx: controller'. –

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