想在SWT中的TreeColumn中创建下拉列表(组合框查看器)

时间:2017-04-10 13:59:17

标签: eclipse eclipse-plugin swt eclipse-rcp jface

我正在使用树,在这棵树上我有一个五个树柱。还要创建两个treeItem,一个是父项和另一个子项,以编程方式将它们的值放在treecolumn中。现在我需要在每个树列(第一个除外)中使用下拉列表(Combobox)来查看列表数据。目前只获得单一价值。请参阅以下代码以获取树状列中可编辑的树项值。

enter image description here

private void editTreeTable(final Tree table){
     final TreeEditor editor = new TreeEditor(table);
        editor.horizontalAlignment = SWT.LEFT;
        editor.grabHorizontal = true;

        table.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseUp(final MouseEvent e) {
                final Control oldEditor = editor.getEditor();
                if (oldEditor != null) {
                    oldEditor.dispose();
                }

                final Point p = new Point(e.x, e.y);
                final TreeItem item = table.getItem(p);
                if (item == null) {
                    return;
                }
                for (int i = 1; i < table.getColumnCount(); ++i) {
                    if (item.getBounds(i).contains(p)) {
                        final int columnIndex = i;
                        // The control that will be the editor must be a
                        final Text newEditor = new Text(table, SWT.NONE);

                        newEditor.setText(item.getText(columnIndex ));

                        newEditor.addModifyListener(new ModifyListener() {
                            public void modifyText(final ModifyEvent e) {
                                final Text text = (Text) editor.getEditor();
                                editor.getItem().setText(columnIndex , text.getText());
                            }
                        });
                        newEditor.selectAll();
                        newEditor.setFocus();
                        editor.setEditor(newEditor, item, columnIndex );
                    }
                }
            }

        });

}

现在找到以下代码从API

获取树项值
private void createTestSuiteTable( final Tree table) 
{      
       //Dispose all elements
    TreeItem items[] = table.getItems();
    for(int i=0;i<items.length;i++)
    {
        items[i].dispose();
    }
    TSGson tsGsons[] = TestSuiteAPIHandler.getInstance().getAllTestSuites();
    boolean checked=false;
    for (TSGson tsGson : tsGsons) 
    {
        parentTestSuite = new TreeItem(table, SWT.NONE|SWT.MULTI);
        parentTestSuite.setText(new String[] { "" +tsGson.tsName, "", "","","","" });
        parentTestSuite.setData("EltType","TESTSUITE");

        if(tsGson.tsTCLink==null)
                continue;

        for(TSTCGson tsTCGson : tsGson.tsTCLink) 
        {
            TreeItem trtmTestcases = new TreeItem(parentTestSuite, SWT.NONE|SWT.MULTI);
            trtmTestcases.setText(new String[] {tsTCGson.tcName, 
                    tsTCGson.tcParams.get(0)!=null ?tsTCGson.tcParams.get(0).tcparamValue:"",
                    tsTCGson.tcParams.get(1)!=null ?tsTCGson.tcParams.get(1).tcparamValue:"",
                    tsTCGson.tcParams.get(2)!=null ?tsTCGson.tcParams.get(2).tcparamValue:"",
                    "local",
                    tsTCGson.tcParams.get(4)!=null ?tsTCGson.tcParams.get(4).tcparamValue:"" });
            trtmTestcases.setData("EltType","TESTCASE");

            table.setSelection(parentTestSuite);
            if(checked)
            {
                  trtmTestcases.setChecked(checked);
            }
        }

    }
}

在SWT中找到以下用于树列创建的代码

localHostTable = new Tree(composite_2,SWT.BORDER | SWT.CHECK | SWT.FULL_SELECTION | SWT.VIRTUAL);
localHostTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
localHostTable.setLinesVisible(true);
localHostTable.setHeaderVisible(true);

TreeColumn trclmnNewColumn_1 = new TreeColumn(localHostTable, SWT.NONE);
trclmnNewColumn_1.setWidth(113);
trclmnNewColumn_1.setText("TestSuite/TestCase");

TreeColumn trclmnColumn_5 = new TreeColumn(localHostTable, SWT.NONE);
trclmnColumn_5.setWidth(73);
trclmnColumn_5.setText("Exe_Platform");


TreeColumn trclmnColumn_6 = new TreeColumn(localHostTable, SWT.NONE);
trclmnColumn_6.setWidth(77);
trclmnColumn_6.setText("Exe_Type");

TreeColumn trclmnColumn_7 = new TreeColumn(localHostTable, SWT.NONE);
trclmnColumn_7.setWidth(85);
trclmnColumn_7.setText("Run_On");

TreeColumn trclmnColumn_8 = new TreeColumn(localHostTable, SWT.NONE);
trclmnColumn_8.setWidth(81);
trclmnColumn_8.setText("Thread-Count");

final TreeColumn trclmnColumn_9 = new TreeColumn(localHostTable, SWT.NONE);
trclmnColumn_9.setWidth(97);
trclmnColumn_9.setText("Column5");

请建议

1 个答案:

答案 0 :(得分:1)

由于您对ComboCCombo控件的问题一无所知,我无法帮助您解决问题。我也不打算为你编写代码,但我可以尝试用一个简短的例子指出你正确的方向。

  

是的,我希望组合始终可见。

您仍然可以使用TreeEditor来完成此操作,它实际上比您使用MouseListener发布的代码段更简单。

像在任何其他情况下一样创建CCombo(或Combo),并使用TreeEditor.setEditor(...)方法指定应在该单元格中显示CCombo控件:

// ...
final CCombo combo = new CCombo(tree, SWT.NONE);
final TreeEditor editor = new TreeEditor(tree);
editor.setEditor(combo, item, 1);
// ...

enter image description here

完整MCVE:

public class TreeComboBoxTest {

    private final Display display;
    private final Shell shell;

    public TreeComboBoxTest() {
        display = new Display();
        shell = new Shell(display);
        shell.setLayout(new FillLayout());

        final Tree tree = new Tree(shell, SWT.BORDER | SWT.VIRTUAL | SWT.FULL_SELECTION);
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        tree.setLinesVisible(true);
        tree.setHeaderVisible(true);

        final TreeColumn column1 = new TreeColumn(tree, SWT.NONE);
        column1.setWidth(75);
        column1.setText("Column 1");

        final TreeColumn column2 = new TreeColumn(tree, SWT.NONE);
        column2.setWidth(75);
        column2.setText("Column 2");

        final TreeItem item = new TreeItem(tree, SWT.NONE);
        item.setText(0, "Hello");

        final CCombo combo = new CCombo(tree, SWT.NONE);
        combo.setItems(new String[] { "Item 1", "Item 2", "Item 3" });

        final TreeEditor editor = new TreeEditor(tree);
        editor.setEditor(combo, item, 1);
        editor.horizontalAlignment = SWT.LEFT;
        editor.grabHorizontal = true;

        // Optional, but allows you to get the current value by calling
        // item.getText() instead of going through the TreeEditor and
        // calling ((CCombo) editor.getEditor()).getText()
        combo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                item.setText(1, combo.getText());
            }
        });
    }

    public void run() {
        shell.setSize(200, 200);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    public static void main(final String... args) {
        new TreeComboBoxTest().run();
    }

}

请注意SelectionListener添加了CCombo。即使您已使用TreeEditor,但如果您致电item.getText(index),则会返回空的String,因为尚未调用setText(...)。通过在监听器中调用setText(...),您不必通过TreeEditor来获取值。

因此,您可以拨打item.getText(index)而不是((CCombo) editor.getEditor()).getText()