从动态生成的SWT表中获取选择值

时间:2011-07-12 05:38:55

标签: swt eclipse-rcp

在我的RCP应用中,我有一个标签文件夹小部件。选项卡文件夹小部件中的每个选项卡项都包含一个表。选项卡项(表示特定大厅的名称)是动态的,每当动态创建选项卡项时,都会创建一个表以在该选项卡项中显示。对于选项卡文件夹中的每个项目,都会动态创建选项卡项目以及表格(以及表格的内容)。

现在,当我尝试在第一个(或除最后一个之外的任何其他选项卡)的表中检索用户选择的值时,我无法获取值。我能够检索和操纵 仅最后一个标签项中的表。看起来前面的选项卡项中的前面的表被稍后动态创建的新表替换/重叠。我该如何解决这个问题?

For Instance,

//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 个答案:

答案 0 :(得分:2)

您多次调用方法displayCTabItems(...)(取决于rs.next()

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

但是你一次又一次地创建Table实例tblHallBooking = new Table(comTabItem, SWT.BORDER | SWT.FULL_SELECTION);到同一个属性tblHallBooking,所以在第一个循环中将属性指向第一个选项卡中的Table实例,在第二个循环中将指向Table在第二个选项卡上等。在每个循环中,您将值(实例“指针”)覆盖到当前创建选项卡上的表。

您必须创建表数组(数组大小等于列表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
        ...
    }
}