2011-07-12 19 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

あなたは

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

rs.next()に依存)複数回メソッドdisplayCTabItems(...)を呼び出していますが、同じ属性tblHallBookingに何度も何度も表インスタンスtblHallBooking = new Table(comTabItem, SWT.BORDER | SWT.FULL_SELECTION);を作成し、その最初のサイクルでのインスタンスに属性ポイントを持っています最初のタブのテーブルの2番目のサイクルでは2番目のタブのテーブルなどを指します。すべてのサイクルで、値(インスタンス "ポインタ")を現在の作成タブのテーブルに上書きします。

EDIT ..

あなたがテーブルの配列は、(配列のサイズがリスト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

私はあなたの2番目の提案と一緒に行きたいと思っていました。 'tabFolder.getSelection()。getControl()'のようなものです。しかし、それは私に** Composite **を返すでしょう。なぜなら、それぞれのタブ項目のために私はコンポジットを定義してそのコンポジット内にのみ、テーブルを配置しているからです。今、どのようにテーブルを手に入れますか?私はsthを試みた。 'tabFolder.getSelection()。getControl()。moveAbove(comTabItem)'のようになります。comTabItemは、タブ項目内のコンポジットの名前です。しかし、テーブルコントロールを返すことはできません。 – mannyee

+0

追加コードの編集を確認してください。 – Sorceror

+0

素晴らしい...完璧に機能しました....ありがとうございます!しかし、私は 'getChildren()[i]'のことを理解していないことを認めなければなりません。私はセマンティクスを理解することができますが、これについての明確な洞察を得ることはできません。私は本当にこれに触れることに感謝します。 – mannyee

関連する問題