如何在JFace的TableViewer中创建一个复选框? [英] How can I create a checkbox in a TableViewer of JFace?

查看:171
本文介绍了如何在JFace的TableViewer中创建一个复选框?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个包含两列的tableViewer,我想让其中一列成为复选框。为此,我创建了一个CheckBoxCellEditor,但我不知道为什么它不起作用。

I have created a tableViewer with two columns and I want to make one of them a checkbox. To do that I have created a CheckBoxCellEditor, but I don´t know why it isn´t working.

名为tableName的列显示其值为OK。

The column called tableName displays it´s values OK.

列规范如下。

    String[] COLUMN_HEADINGS = {"Select", "Table name"};

    TableColumnLayout tableLayout = new TableColumnLayout();
    parent.setLayout(tableLayout);

    //Set what would display each column
    TableViewerColumn selectCheckBox = createTableViewerColumn(COLUMN_HEADINGS[0], 0);
    selectCheckBox.getColumn().setResizable(false);
    selectCheckBox.setLabelProvider(new ColumnLabelProvider(){
         @Override
         public String getText(Object element) {
                 return null;
         }
    });

    //Set what would display each column
    TableViewerColumn tableName = createTableViewerColumn(COLUMN_HEADINGS[1], 1);
    tableName.getColumn().setResizable(false);
    tableName.setLabelProvider(new ColumnLabelProvider(){
        public String getText(Object element) {
            if(element instanceof TableMetaData && element != null)
                return ((TableMetaData)element).getName();
            return super.getText(element);
        }
    });

    //Set the dimensions of each column
    tableLayout.setColumnData(selectCheckBox.getColumn(), new ColumnWeightData(10));
    tableLayout.setColumnData(tableName.getColumn(), new ColumnWeightData(90));

    //Set column type (checkbox)
    selectCheckBox.setEditingSupport(new ResourcesConfigCheckEditingSupport(this));

并且EditingSupport如下:

And the EditingSupport is the following:

public class ResourcesConfigCheckEditingSupport extends EditingSupport{
    private CheckboxCellEditor cellEditor;


    public ResourcesConfigCheckEditingSupport(ColumnViewer viewer) {
        super(viewer);
        // TODO Auto-generated constructor stub
        cellEditor = new CheckboxCellEditor(null, SWT.CHECK | SWT.READ_ONLY);
    }

    @Override
    protected CellEditor getCellEditor(Object element) {
        // TODO Auto-generated method stub
        return cellEditor;
    }

    @Override
    protected boolean canEdit(Object element) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    protected Object getValue(Object element) {
        // TODO Auto-generated method stub
        return ((TableMetaData) element).getIsSelected();
    }

    @Override
    protected void setValue(Object element, Object value) {
        // TODO Auto-generated method stub
        ((TableMetaData) element).setIsSelected(Boolean.valueOf((boolean) value));
        getViewer().update(element, null);

    }
}

TableMetaData对象决定Checkbox是否将被选中或不被选中。如何修复我的代码以使其正常工作?

The TableMetaData object decides if the Checkbox is going to be selected or not. How can I fix my code in order to make it work?

谢谢。

推荐答案

为了使它工作,我使用Vogella的解决方案使用图像。问题是图像不能在表格的单元格中居中,它们出现在它们的左侧。我曾尝试使用X和 - ,但我不知道第一列会发生什么,它既不会使文本居中。所以为了解决这个问题,我更改了列的顺序,并且我使用了unicode字符。

To make it work I used Vogella´s solution using images. The problem is that the images can´t be centered in the table´s cell and they appear in the left of them. I have tried to use "X" and "-", but I don´t know what happens with the first column that it neither centers the text. So to fix that problem I have changed column´s order and I have used unicode characters.

解决方案代码如下编辑支持:

The solution code is the following for editing support:

public class ResourcesConfigCheckEditingSupport extends EditingSupport{
    private CheckboxCellEditor cellEditor;


    public ResourcesConfigCheckEditingSupport(ColumnViewer viewer) {
        super(viewer);
        // TODO Auto-generated constructor stub
        //cellEditor = new CheckboxCellEditor(null, SWT.CHECK | SWT.READ_ONLY);
        cellEditor = new CheckboxCellEditor(((TableViewer)viewer).getTable());
    }

    @Override
    protected CellEditor getCellEditor(Object element) {
        // TODO Auto-generated method stub
        return cellEditor;
    }

    @Override
    protected boolean canEdit(Object element) {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    protected Object getValue(Object element) {
        // TODO Auto-generated method stub
        return ((TableMetaData) element).getIsSelected();
    }

    @Override
    protected void setValue(Object element, Object value) {
        // TODO Auto-generated method stub
        ((TableMetaData) element).setIsSelected(Boolean.valueOf((boolean) value));
        getViewer().update(element, null);

    }
}

以下内容创建列:

public class ResourcesConfigViewer extends TableViewer{

    public ResourcesConfigViewer(Composite parent,int style) 
    {
        super(parent, style);

        //Get the table and set the headers visible and the lines
        Table table = getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        //Create the columns of the tableviewer
        createColumns(parent);

        //Set the tableviewer contentProvider
        setContentProvider(new ResourcesConfigTableContentProvider());
    }

    /*With this function we create the tableviewer columns and how they will (TextCell) and what they would display*/
    private void createColumns(Composite parent)
    {   
        //Headers of the table
        String[] COLUMN_HEADINGS = {"Table name", "Select"};

        TableColumnLayout tableLayout = new TableColumnLayout();
        parent.setLayout(tableLayout);

        //Set what would display each column
        TableViewerColumn tableName = createTableViewerColumn(COLUMN_HEADINGS[0], 0);
        tableName.getColumn().setResizable(false);
        tableName.setLabelProvider(new ColumnLabelProvider(){
            public String getText(Object element) {
                if(element instanceof TableMetaData && element != null)
                    return ((TableMetaData)element).getName();
                return super.getText(element);
            }
        });

        //Set what would display each column
        TableViewerColumn selectCheckBox = createTableViewerColumn(COLUMN_HEADINGS[1], 1);
        selectCheckBox.getColumn().setResizable(false);
        selectCheckBox.setLabelProvider(new ColumnLabelProvider(){
            public String getText(Object element) {
                if(element instanceof TableMetaData && element != null){
                    if(((TableMetaData)element).getIsSelected()){
                        return Character.toString((char)0x2611);
                    }else{
                        return Character.toString((char)0x2610);
                    }
                }
                return super.getText(element);
                //return null;
            }

            @Override
            public Image getImage(Object element) {
                /*if(element instanceof TableMetaData && element != null){
                    if(((TableMetaData)element).getIsSelected()){
                        return checked;
                    }else{
                        return unChecked;
                    }
                }
                return super.getImage(element);*/
                return null;
            }
        });



        //Set the dimensions of each column
        tableLayout.setColumnData(selectCheckBox.getColumn(), new ColumnWeightData(10));
        tableLayout.setColumnData(tableName.getColumn(), new ColumnWeightData(90));

        //Set column type (checkbox)
        selectCheckBox.setEditingSupport(new ResourcesConfigCheckEditingSupport(this));
    }

    //Creates the column
    private TableViewerColumn createTableViewerColumn(String header, int idx) 
    {
        //To put checkbox centered in cell.
        int infoLocation = SWT.LEFT;
        if(idx == 1){
            infoLocation = SWT.CENTER;
        }
        TableViewerColumn column = new TableViewerColumn(this, infoLocation, idx);
        column.getColumn().setText(header);
        column.getColumn().setResizable(true);
        column.getColumn().setMoveable(true);

        return column;
    }
}

解决方案图片

这篇关于如何在JFace的TableViewer中创建一个复选框?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆