如何使用任意控件获取swt表上的文本内容

时间:2009-03-11 14:51:58

标签: java swt

我使用TableEditor在桌面上放置了不同的控件。

...
TableItem [] items = table.getItems ();
for (int i=0; i<items.length; i++) {
    TableEditor editor = new TableEditor (table);
    final Text text1 = new Text (table, SWT.NONE);
    text1.setText(listSimOnlyComponents.get(i).getName());
    text1.setEditable(false);
    editor.grabHorizontal = true;
    editor.setEditor(text1, items[i], 0);

    editor = new TableEditor (table);
    final CCombo combo1 = new CCombo (table, SWT.NONE);
    combo1.setText("");
    Set<String> comps = mapComponentToPort.keySet();
    for(String comp:comps)
        combo1.add(comp);
    editor.grabHorizontal = true;
    editor.setEditor(combo1, items[i], 1);
} //end of for
...

当我尝试使用getItem(i).getText获取表格上的文字时,我得到空字符串

...
TableItem [] items = table.getItems ();
for(int i=0; i<items.length; i++) {
    TableItem item = items[i];
    String col0text = items[i].getText(0);  //this text is empty
    String col1text = items[i].getText(1);  //this text is empty
}
...

为什么即使我在桌面上出现文字,getText也会返回空字符串?

3 个答案:

答案 0 :(得分:3)

您可以考虑使用data属性而不是使用text属性。

优点:

  1. 您可以将数据(例如控件或复杂数据结构)直接附加到表项。
  2. 您的表项创建需要从表格单元格编辑器中获知的唯一内容是要存储在data属性中的对象引用。
  3. 您不需要事件处理(只需在您真正需要时读取控件数据)。
  4. 创建:

    TableItem item = new TableItem(table, SWT.None);
    TableEditor editor = new TableEditor(table);
    Button checkbox = new Button(table, SWT.CHECK);
    checkbox.pack();
    editor.setEditor(checkbox,item,0);
    item.setData("cb",checkbox);   // using key enables you to add more pieces of complex data
    

    读:

    for (TableItem item : table) {
      Button checkbox = (Button) item.getData("cb");
      if (checkbox.getSelection()) { /* ... do whatever you want */ }
    }
    

    当表格显示时,该复选框可见,可以单击。在透明背景控件的情况下使用setText方法失败 - &gt;您将在下面看到表项单元格的文本 你的控制(我试过这个)。

    无论如何,如果可以扩展表项类以隐藏数据键,那将会容易得多。但像往常一样,子类化被拒绝。

答案 1 :(得分:1)

在我添加的控件的侦听器中

  item.setText call
  ...
  combo1.addSelectionListener(new SelectionAdapter() {
  public void widgetSelected(SelectionEvent evt) {
              String sel = combo2.getText();
      item.setText(ComponentPortToConnectCol, sel);
}});
  ...

这给了我想要的结果。感谢OTisler的线索

答案 2 :(得分:0)

你是如何摆桌子的?我复制了你的代码来调试它并设置如下所示的表(首先是循环)
我试过但无法重现你所看到的问题。它可能是您向表中添加内容的方式。
TableEditor Examples

Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        final Table table = new Table(shell, SWT.BORDER | SWT.MULTI);
        for (int i = 0; i < 3; i++) {
            TableItem item = new TableItem(table, SWT.NONE);
            item.setText(new String[] { "" + i, "" + i, "" + i });
        }
        TableItem [] items = table.getItems();
        for (int i=0; i<items.length; i++) {
            TableEditor editor = new TableEditor (table);
            final Text text1 = new Text (table, SWT.NONE);
            text1.setText("TEST");
            text1.setEditable(false);
            editor.grabHorizontal = true;
            editor.setEditor(text1, items[i], 0);

            editor = new TableEditor (table);
            final CCombo combo1 = new CCombo (table, SWT.NONE);
            combo1.setText("");
            String[] comps = {"A","B","C"};
            for(String comp:comps)
                combo1.add(comp);
            editor.grabHorizontal = true;
            editor.setEditor(combo1, items[i], 1);
        } //end of for


        TableItem [] items2 = table.getItems ();
        for(int i=0; i<items2.length; i++) {
            TableItem item = items2[i];
            String col0text = items2[i].getText(0);  //returns '0' first for loop
        }