如何初始化TabPane(JavaFX)

时间:2016-05-23 11:58:40

标签: java javafx

在我的GUI中,我尝试显示其中包含其他元素的TabPane

调用特定场景的initialize-method时,我可以将所需数据添加到第一个Tab。

如何访问第二个并在那里添加数据?

当你在单个标签之间切换时是否有一个被调用的方法,或者是否可以通过initialize方法来调用它?

//all the fields

@FXML
private void initialize() {
    smsHandynumberColumn.setCellValueFactory(cellData -> cellData.getValue().numberProperty());
    smsHandyproviderColumn.setCellValueFactory(cellData -> cellData.getValue().providerProperty());
    displayHandyDetails(null);
    smsHandyList.getSelectionModel().selectedItemProperty()
            .addListener((observable, oldValue, newValue) -> displayHandyDetails(newValue));

//  providernameColumn.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
//  provideramountColumn.setCellValueFactory(cellData -> cellData.getValue().sizeProperty());
}

@FXML
private void displayHandyDetails(SmsHandy handy) {
    if (handy != null) {
        handyNumberLabel.setText(handy.getNumber());
        providerLabel.setText(handy.getProvider().getName());
        registerLabel.setText(handy.getDate().toString());
        receivedLabel.setText(Integer.toString(handy.getReceivedList().size()));
        sentLabel.setText(Integer.toString(handy.getSentList().size()));
        if (handy instanceof PrepaidSmsHandy) {
            balanceLabel.setText(Integer.toString(handy.getProvider().getCreditForSmsHandy(handy.getNumber()))
                    + " Cent on account");
            typeLabel.setText("Prepaid");
        } else {
            balanceLabel.setText(
                    Integer.toString(((TariffPlanSmsHandy) handy).getRemainingFreeSms()) + " free SMS left");
            typeLabel.setText("Tariff-Plan");
        }
    } else {
        handyNumberLabel.setText(" ");
        providerLabel.setText(" ");
        registerLabel.setText(" ");
        typeLabel.setText(" ");
        balanceLabel.setText(" ");
        receivedLabel.setText(" ");
        sentLabel.setText(" ");
    }
}

public void setMainApp(MainApp mainApp) {
    this.mainApp = mainApp;
    smsHandyList.setItems(mainApp.getHandyList());
}

}

所以,这是控制器类。按照它的方式,我可以工作。使用第一个选项卡窗格(当您查看它时默认显示)。

FXML文件:http://pastebin.com/MQ0C8EWD

2 个答案:

答案 0 :(得分:1)

首先初始化tabpane,然后初始化所需的所有选项卡。您可以设置标题和内容,但不要忘记将所有标签添加到tabPane。

 TabPane tabPane = new TabPane();
 Tab tab1 = new Tab();
 tab.setText("tab 1");
 tab.setContent(new Rectangle(200,200, Color.LIGHTSTEELBLUE));
 Tab tab2 = new Tab();
 tab.setText("tab 2");
 tab.setContent(new Rectangle(200,200, Color.RED));
 tabPane.getTabs().addAll(tab1, tab2);

更多信息:https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TabPane.html

答案 1 :(得分:0)

好的,我不确定我是否理解这个问题。

如果您询问如何访问存储在Tab的第二个TabPane上的GUI元素,答案是:

TabPane实际上只是一个简单的容器,所以如果你插入两个控件两个相同的Tab(就FXML注入而言),你将它们插入两个独立的{{1} }。

我可以看到你在第二个标签上的FXML中创建了Tabs,如:

TableView

所以,如果你说:

<TableView fx:id="providerList" layoutX="-11.0" layoutY="14.0" prefHeight="264.0" prefWidth="250.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">

在控制器的类主体中,然后在控制器的@FXML TableView providerList; 方法中,您将引用该initialize(与您在TableView上完全相同第一个smsHandyList)。

这就是所谓的&#34; FXML注射&#34;。您可以查看post from Oracle如何将FXML与Java代码连接。