2011-07-12 74 views
0

在我的RCP應用程序中,我有一個選項卡文件夾小部件。選項卡文件夾小部件中的每個選項卡項都包含一個表。選項卡項目(代表特定大廳的名稱)是動態的,無論何時動態創建選項卡項目,都會創建一個表格以在該選項卡項目中顯示。選項卡項目與標籤文件夾中每個項目的表格(以及表格內容)一起動態創建。從動態生成的SWT表中獲取選擇值

現在,當我嘗試在第一個表格(或除最後一個之外的任何其他選項卡)中檢索用戶選擇的值時,我無法獲取這些值。我只能在最後一個選項卡項中檢索和操作 表。看起來前面的選項卡項目中的上述表格被稍後動態創建的新表格替換/重疊。我該如何解決這個問題?

例如,

//createPartControl method 
public void createPartControl(Composite parent) { 
    ..... 
    .....  

    createTabFolder(); 
} 


// createTabFolder() method 
private void createTabFolder() { 

tabFolder = new CTabFolder(comMainContainer, SWT.BORDER); 
tabFolder.setBounds(204, 21, 769, 495); 
    tabFolder.setSelectionBackground(Display.getCurrent().getSystemColor(
      SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT)); 

    // display the tabitems in the tabfolder dynamically 
    try { 
     selectedDate = sdf.format(dateChooser.getSelectedDate()); 
     rs = objHallBookingController.getHallList(); 

     while (rs.next()) { 

      displayCtabItems(rs.getString("hall_name"), 
        rs.getInt("hall_id")); 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 


// displayCtabItems method 
private void displayCtabItems(String hallName, int hallId) { 

      tabItem = new CTabItem(tabFolder, SWT.NONE); 
    tabItem.setText(hallName); 

    comTabItem = new Composite(tabFolder, SWT.NONE); 
    tabItem.setControl(comTabItem); 


    tblHallBooking = new Table(comTabItem, SWT.BORDER | SWT.FULL_SELECTION); 
    tblHallBooking.setHeaderVisible(true); 
    tblHallBooking.setLinesVisible(true); 

    tblclmnTime = new TableColumn(tblHallBooking[hallId], SWT.NONE); 
    tblclmnTime.setWidth(88); 
    tblclmnTime.setText("Time"); 

    tblclmnTitle = new TableColumn(tblHallBooking[hallId], SWT.NONE); 
    tblclmnTitle.setWidth(306); 
    tblclmnTitle.setText("Title"); 

      // display contents in the table; working fine 
    displayHallOpeningTime(Integer.parseInt(txtHallId.getText())); 
     } 

此代碼生成並顯示的標籤項和表。但是我不能操縱除最後一個之外的選項卡中的表格中的內容。

+1

讓你的表能否請您做一些測試案例(小的應用程序,顯示您的不受歡迎的行爲)..? – Sorceror

+0

請參閱編輯,我已經在問題中添加了一個代碼示例。 – mannyee

回答

2

你調用方法displayCTabItems(...)超過一次(取決於rs.next()

while (rs.next()) { 
    displayCtabItems(rs.getString("hall_name"), 
     rs.getInt("hall_id")); 
} 

,但你一次又一次地創建表實例tblHallBooking = new Table(comTabItem, SWT.BORDER | SWT.FULL_SELECTION);以相同的屬性tblHallBooking,所以在第一個週期將有屬性點實例第一個選項卡中的表格,第二個循環中的表格將指向第二個選項卡上的表格等。在每個循環中,您將當前創建選項卡上的值(實例「指針」)覆蓋到表格。

你必須要表的陣列(數組的大小等於項目的尺寸在列表objHallBookingController.getHallList();),或者你必須動態地查找到所選擇CTabItem的兒童和查找表例如..

編輯

基於您的評論,在這裏可能是這樣,如何從選擇CTabItem

Control parent = tabFolder.getSelection().getControl(); 
if(parent instanceof Composite) { 
    Composite parentComposite = (Composite) parent; 
     Control control = null; 
     for(int i = 0; i < parentComposite.getChildren().length; i++) { 
      if(parentComposite.getChildren()[i] instanceof Table) { 
       control = parentComposite.getChildren()[i]; 
       break; 
      } 
     } 
     if(control != null) { 
     // now you have your table in control 
     Table tbl = (Table) control; 
     // do whatever you want with tbl 
     ... 
    } 
} 
+0

我想和你的第二個建議一起去,我做了某事。像'tabFolder.getSelection()。getControl()'。但是那會給我一個**複合**,這是因爲對於每個標籤項目,我已經定義了一個複合並且僅在該複合內部,我已經放置了該表。現在,我如何獲得表格?我試過了。例如'tabFolder.getSelection()。getControl()。moveAbove(comTabItem)'其中comTabItem是選項卡項目內組合的名稱。但我不能得到表控制返回。 – mannyee

+0

檢查編輯的額外代碼.. – Sorceror

+0

偉大的......完美無缺....感謝你!但我必須承認,我不明白'getChildren()[我]'的東西。我可以理解語義,但沒有清楚地瞭解這一點。我真的很感謝指出這一點。 – mannyee

相關問題