2016-10-20 106 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創建UI和控制器,我必須做什麼?事實上,我正在尋找一種方法來管理每個選項卡和幾個控件的選項卡窗格,但即使在實現這個簡單的示例我有問題。

enter image description here

+0

這甚至不爲我編譯。 –

+0

您應該始終包含您在問題中獲得的堆棧跟蹤(例外)。 –

回答

2

如果您在使用動態

fxmlLoader.setRoot(...); 

設置root你需要使用<fx:root>元素作爲FXML的根元素。請參閱documentation

此外,如果你在代碼中設置控制器

fxmlLoader.setController(...); 

你應該指定在FXML文件fx:controller屬性。所以你的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

FXMLLoader的setRoot()和setController()方法允許調用者分別將文檔根和控制器值注入到文檔名稱空間中,而不是委託創建這些值給FXMLLoader本身。這使得開發人員可以輕鬆創建內部使用標記實現的可重用控件,但是(從API角度來看)與以編程方式實現的控件完全相同。 – delsa

+0

@delsa他們的意思正是他們所說的:不確定我可以澄清很多。如果調用'setRoot(..)',根元素由Java代碼指定,而不是由FXMLLoader根據FXML文件的根元素創建。因此,將類指定爲FXML的根本沒有意義;你可以用''代替。同樣,'setController(...)'指定一個控制器。如果你指定了一個控制器,它不是由'FXMLLoader'創建的,所以指示'FXMLLoader'來創建一個控制器是沒有意義的,這就是'fx:controller'屬性的作用。 –

相關問題