Выборка значений выбора из динамически генерируемых таблиц SWT - PullRequest
0 голосов
/ 12 июля 2011

В моем приложении RCP у меня есть виджет папки с вкладками. Каждый из элементов вкладки в виджете папки вкладок содержит одну таблицу. Элементы вкладок (представляют название определенного зала) являются динамическими, и всякий раз, когда элемент вкладки создается динамически, создается таблица для отображения в этом элементе вкладки. Элементы вкладок создаются динамически вместе с таблицей (и содержимым таблицы) для каждого элемента в папке вкладок.

Теперь, когда я пытаюсь получить выбранные пользователем значения в таблице в первой (или любой другой вкладке, кроме последней), я не могу получить значения. Я могу извлечь и манипулировать только таблица в последнем элементе вкладки. Кажется, что предыдущие таблицы в предыдущих элементах вкладок заменяются / перекрываются новыми таблицами, которые впоследствии создаются динамически. Как мне это решить?

Для экземпляра,

//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 Ответ

2 голосов
/ 13 июля 2011

Вы вызываете метод 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 и искать экземпляр таблицы.

EDIT

Исходя из вашего комментария, здесь может быть способ, как получить вашу таблицу из выбранного 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
        ...
    }
}
...