2016-10-20 66 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'属性的作用。 –

相关问题