Eclipse rcp 在org.eclipse.swt.widgets.Table中启用单列选择

Eclipse rcp 在org.eclipse.swt.widgets.Table中启用单列选择,eclipse-rcp,Eclipse Rcp,我使用了org.eclipse.swt.widgets.Table 代码实现如下所示 表格=新表格(外壳,SWT.SINGLE | SWT.BORDER | SWT.FULL | U选择) 但我需要这样的行为:如果鼠标单击“Sec_1”,我只想选择“Sec_1”,而不是整行;如果鼠标单击“First_1”,我不想突出显示它(FirstColumn无选择)。 有人能帮我吗?请查看此代码片段,例如(): 公共类测试{ 私有类MyContentProvider实现IStructuredContent

我使用了org.eclipse.swt.widgets.Table 代码实现如下所示

表格=新表格(外壳,SWT.SINGLE | SWT.BORDER | SWT.FULL | U选择)

但我需要这样的行为:如果鼠标单击“Sec_1”,我只想选择“Sec_1”,而不是整行;如果鼠标单击“First_1”,我不想突出显示它(FirstColumn无选择)。
有人能帮我吗?

请查看此代码片段,例如():

公共类测试{
私有类MyContentProvider实现IStructuredContentProvider{
/*
*(非Javadoc)
* 
*@see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
公共对象[]getElements(对象inputElement){
返回(MyModel[])inputElement;
}
/*
*(非Javadoc)
* 
*@see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
公共空间处置(){
}
/*
*(非Javadoc)
* 
*@see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
*java.lang.Object,java.lang.Object)
*/
public void inputChanged(查看器、对象oldInput、对象newInput){
}
}
公共静态布尔标志=true;
公共类MyModel{
公共int计数器;
公共MyModel(整数计数器){
this.counter=计数器;
}
公共字符串toString(){
返回“项目”+此计数器;
}
}
公共类MyLabelProvider扩展了LabelProvider实现
ITableLabelProvider、ITableFontProvider、ITableColorProvider{
FontRegistry注册表=新FontRegistry();
公共映像getColumnImage(对象元素,int columnIndex){
返回null;
}
公共字符串getColumnText(对象元素,int columnIndex){
返回“Column”+columnIndex+“=>”+元素.toString();
}
公共字体getFont(对象元素,int columnIndex){
返回null;
}
公共颜色getBackground(对象元素,int columnIndex){
返回null;
}
公共颜色getForeground(对象元素,int columnIndex){
返回null;
}
}
公共测试(外壳){
最终TableViewer v=新的TableViewer(外壳、SWT.BORDER | SWT.FULL_选择);
v、 setLabelProvider(新的MyLabelProvider());
v、 setContentProvider(新的MyContentProvider());
v、 SetCellEditor(新的CellEditor[]{new TextCellEditor(v.getTable())、new TextCellEditor(v.getTable())、new TextCellEditor(v.getTable())};
v、 setCellModifier(新的ICellModifier(){
公共布尔值canModify(对象元素,字符串属性){
返回true;
}
公共对象getValue(对象元素,字符串属性){
返回“Column”+属性+“=>”+元素.toString();
}
公共void修改(对象元素、字符串属性、对象值){
}
});
v、 setColumnProperties(新字符串[]{“1”、“2”、“3”});
TableViewerFocusCellManager focusCellManager=新的TableViewerFocusCellManager(v,新的FocusCellOwnerDrawHighlighter(v));
ColumnViewerEdit或ActivationStrategy actSupport=新ColumnViewerEdit或ActivationStrategy(v){
受保护的布尔isEditorActivationEvent(
ColumnViewerEdit或ActivationEvent(事件){
return event.eventType==ColumnViewerEdit或ActivationEvent.TRAVERSAL
||event.eventType==ColumnViewerEdit或ActivationEvent.MOUSE\u双击\u选择
||(event.eventType==ColumnViewerEditorActivationEvent.KEY\u按下&event.keyCode==SWT.CR)
||event.eventType==ColumnViewerEdit或ActivationEvent.Programming;
}
};
TableViewerEditor.create(v,focusCellManager,actSupport,ColumnViewerEditor.tab)
|ColumnViewerEditor.TABBING\将\移动到\行\邻居
|ColumnViewerEditor.TABBING_垂直| ColumnViewerEditor.KEYBOARD_激活);
TableColumn=newtableColumn(v.getTable(),SWT.NONE);
列宽(200);
column.setMoveable(true);
第1列(“第1列”);
column=newtablecolumn(v.getTable(),SWT.NONE);
列宽(200);
column.setMoveable(true);
第2栏(“第2栏”);
column=newtablecolumn(v.getTable(),SWT.NONE);
列宽(200);
column.setMoveable(true);
第3栏(“第3栏”);
MyModel[]model=createModel();
v、 设置输入(模型);
v、 getTable().setLinesVisible(true);
v、 getTable().setheadervible(true);
}
私有MyModel[]createModel(){
MyModel[]元素=新的MyModel[10];
对于(int i=0;i<10;i++){
元素[i]=新的MyModel(i);
}
返回元素;
}
/**
*@param args
*/
公共静态void main(字符串[]args){
显示=新显示();
外壳=新外壳(显示);
setLayout(新的FillLayout());
新试验(壳体);
shell.open();
而(!shell.isDisposed()){
如果(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}

谢谢。这有帮助。我认为有必要指出实现这种行为的关键类。它们是TableViewerFocusCellManager、ColumnViewerEditor激活策略和TableViewerEditor.create()
public class Test {

private class MyContentProvider implements IStructuredContentProvider {

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
     */
    public Object[] getElements(Object inputElement) {
        return (MyModel[]) inputElement;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IContentProvider#dispose()
     */
    public void dispose() {

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
     *      java.lang.Object, java.lang.Object)
     */
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

    }

}

public static boolean flag = true;

public class MyModel {
    public int counter;

    public MyModel(int counter) {
        this.counter = counter;
    }

    public String toString() {
        return "Item " + this.counter;
    }
}

public class MyLabelProvider extends LabelProvider implements
        ITableLabelProvider, ITableFontProvider, ITableColorProvider {
    FontRegistry registry = new FontRegistry();

    public Image getColumnImage(Object element, int columnIndex) {
        return null;
    }

    public String getColumnText(Object element, int columnIndex) {
        return "Column " + columnIndex + " => " + element.toString();
    }

    public Font getFont(Object element, int columnIndex) {
        return null;
    }

    public Color getBackground(Object element, int columnIndex) {
        return null;
    }

    public Color getForeground(Object element, int columnIndex) {
        return null;
    }

}

public Test(Shell shell) {
    final TableViewer v = new TableViewer(shell, SWT.BORDER|SWT.FULL_SELECTION);
    v.setLabelProvider(new MyLabelProvider());
    v.setContentProvider(new MyContentProvider());

    v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTable()), new TextCellEditor(v.getTable()), new TextCellEditor(v.getTable()) });
    v.setCellModifier(new ICellModifier() {

        public boolean canModify(Object element, String property) {
            return true;
        }

        public Object getValue(Object element, String property) {
            return "Column " + property + " => " + element.toString();
        }

        public void modify(Object element, String property, Object value) {

        }

    });

    v.setColumnProperties(new String[] {"1","2","3"});

    TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(v,new FocusCellOwnerDrawHighlighter(v));
    ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(v) {
        protected boolean isEditorActivationEvent(
                ColumnViewerEditorActivationEvent event) {
            return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
                    || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
                    || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
                    || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
        }
    };

    TableViewerEditor.create(v, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
            | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
            | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);


    TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
    column.setWidth(200);
    column.setMoveable(true);
    column.setText("Column 1");

    column = new TableColumn(v.getTable(), SWT.NONE);
    column.setWidth(200);
    column.setMoveable(true);
    column.setText("Column 2");

    column = new TableColumn(v.getTable(), SWT.NONE);
    column.setWidth(200);
    column.setMoveable(true);
    column.setText("Column 3");


    MyModel[] model = createModel();
    v.setInput(model);
    v.getTable().setLinesVisible(true);
    v.getTable().setHeaderVisible(true);
}

private MyModel[] createModel() {
    MyModel[] elements = new MyModel[10];

    for (int i = 0; i < 10; i++) {
        elements[i] = new MyModel(i);
    }

    return elements;
}

/**
 * @param args
 */
public static void main(String[] args) {
    Display display = new Display();

    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());
    new Test(shell);
    shell.open();

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

    display.dispose();

}

}