如何在 SWT table 中保留一个额外的空行?

How can I keep an extra empty row in a SWT table?

如何在不在模型中添加虚拟值的情况下在 SWT table 中保留一个额外的空行?我想始终显示一个空行以便在最后一行周围绘制一个矩形?有什么线索吗?

场景:table 大小将被修复。如果我有 5 个项目,那么我希望第六行为空,以便我可以绘制。如果我有 100 行,那么我想要第 101 个位置的空行,并且 table 应该在某个事件上滚动并显示绘制的矩形。

希望尽快看到答案。

最后,我能够在 table 中添加一个空行,而无需在内容提供程序中添加虚拟值。这是我所做的: 我扩展了 JFace TableViewer class 并覆盖了 refresh()、refresh(Object element) 和 inputChanged(Object input, Object oldInput) 方法。基本上在所有这三种方法中,如果有空项目,我首先删除空项目,然后让原始 jface 方法调用发生,然后我再次添加新的空项目 table。

下面是对我有用的代码。

import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;



/**
 * @author amitkumar
 */
public class ExtraEmptyRowTableViewer extends TableViewer {

    boolean addExtraRow = false;

    public ExtraEmptyRowTableViewer(Composite parent) {
        super(parent);
        IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
        if (workbenchWindow != null
                && workbenchWindow.getActivePage() != null
                && workbenchWindow.getActivePage().getActiveEditor() != null
                && workbenchWindow.getActivePage().getActiveEditor().getClass().getName().equals(
                        "org.eclipse.compare.internal.CompareEditor")) {
            addExtraRow = true;
        }
    }

    public ExtraEmptyRowTableViewer(Composite composite, int style) {
        super(composite, style);
        IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
        if (workbenchWindow != null
                && workbenchWindow.getActivePage() != null
                && workbenchWindow.getActivePage().getActiveEditor() != null
                && workbenchWindow.getActivePage().getActiveEditor().getClass().getName().equals(
                        "org.eclipse.compare.internal.CompareEditor")) {
            addExtraRow = true;
        }
    }

    @Override
    public void refresh(Object element) {
        if (!addExtraRow) {
            super.refresh(element);
        } else {
            removeEmptyRow();
            super.refresh(element);
        }
    }

    @Override
    protected void inputChanged(Object input, Object oldInput) {
        if (!addExtraRow) {
            super.inputChanged(input, oldInput);
        } else {
            removeEmptyRow();
            super.inputChanged(input, oldInput);
            @SuppressWarnings("unused")
            TableItem tableItem = new TableItem(getTable(), SWT.NO_BACKGROUND | SWT.NO_FOCUS);
        }

    }

    public void removeEmptyRow() {
        try {
            for (TableItem tableItem : getTable().getItems()) {
                if (tableItem == null || tableItem.getText() == null
                        || "".equals(tableItem.getText())) {
                    tableItem.dispose();
                }
            }
        } catch (Exception e) {
        }
    }

    @Override
    public void refresh() {
        if (!addExtraRow) {
            super.refresh();
        } else {
            removeEmptyRow();
            super.refresh();
            @SuppressWarnings("unused")
            TableItem tableItem = new TableItem(getTable(), SWT.NO_BACKGROUND | SWT.NO_FOCUS);
        }
    }

}

谢谢... 阿米特·库马尔