我目前正在编写一个使用JFace TableViewer的应用程序。表格旁边有一个Button,可向其中添加新项目。在此示例中,TableViewer仅具有一列,但是此列具有分配给它的EditingSupport

一切都按预期进行。当我单击按钮时,一个新项将添加到表中,并且该项也会自动选择。

但是,我要实现的是为新项目触发此列的EditingSupport,即,当添加新项目时,新行中的单元格应自动显示当您使用编辑支持。

我将如何实现?我需要伪造鼠标事件还是API中缺少某些东西?

这是一些示例代码,大致显示了表格的当前状态

public static void main(String[] args)
{
    final Display d = new Display();
    Shell s = new Shell(d);
    s.setLayout(new FillLayout());

    List<Project> projects = new ArrayList<>();

    Table table = new Table(s, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
    table.setHeaderVisible(true);
    TableViewer viewer = new TableViewer(table);
    viewer.setContentProvider(ArrayContentProvider.getInstance());
    viewer.setInput(projects);

    TableViewerColumn nameColumn = new TableViewerColumn(viewer, SWT.NONE);
    nameColumn.getColumn().setText("Project name");
    nameColumn.setLabelProvider(new ColumnLabelProvider()
    {
        @Override
        public String getText(Object element)
        {
            Project p = (Project) element;
            return p.name;
        }
    });
    // Add the editing support
    nameColumn.setEditingSupport(new ProjectNameEditingSupport(viewer));

    // Button to add new item
    Button add = new Button(s, SWT.PUSH);
    add.setText("Add");
    add.addListener(SWT.Selection, e -> {
        // Create the new item
        Project project = new Project("Project");
        projects.add(project);
        // Refresh the table
        viewer.refresh();
        // Select the item
        viewer.setSelection(new StructuredSelection(project), true);
        // TODO: Trigger editing support
    });

    for (TableColumn c : viewer.getTable().getColumns())
        c.pack();

    s.pack();
    s.open();
    s.setSize(300, 400);

    while (!s.isDisposed())
    {
        if (!d.readAndDispatch())
            d.sleep();
    }
    d.dispose();
}

private static class Project
{
    private String name;

    public Project(String name)
    {
        this.name = name;
    }
}

public static class ProjectNameEditingSupport extends EditingSupport
{

    private final TableViewer viewer;
    private final CellEditor  editor;

    public ProjectNameEditingSupport(TableViewer viewer)
    {
        super(viewer);
        this.viewer = viewer;
        this.editor = new TextCellEditor(viewer.getTable());
    }

    @Override
    protected CellEditor getCellEditor(Object element)
    {
        return editor;
    }

    @Override
    protected boolean canEdit(Object element)
    {
        return true;
    }

    @Override
    protected Object getValue(Object element)
    {
        return ((Project) element).name;
    }

    @Override
    protected void setValue(Object element, Object userInputValue)
    {
        ((Project) element).name = String.valueOf(userInputValue);
        viewer.update(element, null);
    }
}

最佳答案

IIRC您可以使用ColumnViewer::editElement来激活编辑控件。第一个方法参数是应编辑的元素,第二个参数是应在其上打开编辑器的列的索引。

例如:

viewer.editElement( project, 0 );

关于java - 如何在TableViewer上触发EditingSupport,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46728312/

10-09 13:01