2016-05-23 178 views
0

在我的GUI中,我嘗試顯示一個TabPane與其中的其他元素。如何初始化一個TabPane(JavaFX)

當調用特定場景的初始化方法時,我可以將所需的數據添加到第一個選項卡。

如何訪問第二個,有添加數據?`

是否有當u單個標籤之間切換,或者被調用是否有可能將其從初始化方法的方法?

//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()); 
} 

}

所以,這是控制器類。就這樣,我可以工作obv。與第一個選項卡窗格(默認情況下顯示時,你看它)。

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

回答

0

好吧,我不知道我理解這個問題正確。

如果你問如何訪問存儲在您TabPane的第二Tab GUI元素,得到的答覆是:

TabPane實際上只是一個簡單的容器,因此,如果您將兩個控制兩個相同Tab (就FXML注入而言),您將其插入兩個單獨的Tabs

我可以看到你已經在你的FXML創建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(與第Tab上的smsHandyList完全相同)。

這就是所謂的「FXML注入」。你可以檢查這個post from Oracle如何連接FXML和Java代碼。

+0

第一:是的,這是問題:)事情是:我不能只是從初始化方法訪問第二個窗格上的表,我在那裏得到一個空點異常。我會複製它。 – Master1114

+0

是的,那麼請包括FXML注射部分也 – DVarga

+0

或更好地張貼您的整個控制器。 – DVarga

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

+0

我正在使用帶有JavaFx控制器類的SceneBuilder。所以我覺得它對我有點不同?我沒有手動使用標籤,所以我不能只是簡單地打電話給另一個標籤 – Master1114

+0

對不起,我沒有太多的經驗,我很害怕scenebuilder。你可以看看這裏:http://docs.oracle.com/javafx/scenebuilder/1/user_guide/library-panel.htm也許它會幫助你。 – JC97

+0

如果你編輯你的問題,包括你的FXML文件和當前控制器類,我可以給你寫一個答案你可以做:) – DVarga