在我的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()));
}
此代码生成并显示选项卡项和表。但是我不能操纵除最后一个之外的选项卡中表格中的内容。
答案 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
...
}
}