如何在 TableViewer 上触发 EditingSupport
How to trigger EditingSupport on TableViewer
我目前正在编写一个使用 JFace TableViewer
的应用程序。 table 旁边有一个 Button
,用于向其中添加新项目。 TableViewer
在此示例中只有一列,但此列已分配给它 EditingSupport
。
一切如期进行。当我单击按钮时,一个新项目被添加到 table 并且它也被自动选中。
但是,我想实现的是,该列的EditingSupport
是为新项目触发的,即当添加新项目时,新行内的单元格应自动显示文本输入当您使用编辑支持时会显示。
我该如何实现?我是否需要伪造一个鼠标事件,或者 API 中是否有我遗漏的东西?
下面是一些示例代码,大致显示了 table
的当前状态
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 );
我目前正在编写一个使用 JFace TableViewer
的应用程序。 table 旁边有一个 Button
,用于向其中添加新项目。 TableViewer
在此示例中只有一列,但此列已分配给它 EditingSupport
。
一切如期进行。当我单击按钮时,一个新项目被添加到 table 并且它也被自动选中。
但是,我想实现的是,该列的EditingSupport
是为新项目触发的,即当添加新项目时,新行内的单元格应自动显示文本输入当您使用编辑支持时会显示。
我该如何实现?我是否需要伪造一个鼠标事件,或者 API 中是否有我遗漏的东西?
下面是一些示例代码,大致显示了 table
的当前状态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 );