每次添加新项目到列表时刷新TableViewer表

时间:2014-09-23 18:33:49

标签: java swt tableviewer

我创建了一个TableViewer表来显示来自ArrayList的数据。我想在每次向列表中添加新项目时刷新表格。但是现在表等待,直到我的所有数据都被添加到列表中,然后表将立即显示所有数据。有人可以帮我解决这个问题吗?我在这里被困了很长时间......这是一些代码

private void buildPerformanceTable(
        IPerformanceDataRetriever performanceDataRetriever) {

    tableViewer.setContentProvider(new JobProfileContentProvider());
    tableViewer.setLabelProvider(new JobProfileLabelProvider());
    tableViewer.setComparator(new JobProfileViewerComparator());
    Table table = tableViewer.getTable();

    for (ColumnType columnType : ColumnType.values()) {
        buildTableColumn(columnType.getColumnName(),
                columnType.getColumnIndex());
    }

    tableViewer.setInput(performanceDataRetriever);

    for (int i = 0; i < table.getColumnCount(); i++) {
        table.getColumn(i).pack();
    }
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
}


public class JobProfileContentProvider implements IStructuredContentProvider{

    private static final long SERIAL_VERSION_UID = 6452458171326245659L;



    /**
     * {@inheritDoc}
     */
    @Override
    public Object[] getElements(Object object) {
        return ((IPerformanceDataRetriever) object).providePerformanceData()
                .toArray();
    }

    /**
     * <b>This method is not implemented.</b> <br>
     * 
     * {@inheritDoc}
     */
    @Override
    public void dispose() {
    }

    /**
     * <b>This method is not implemented.</b> <br>
     * 
     * {@inheritDoc}
     */
    @Override
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    }
}


public class JobProfileInfoMock implements IPerformanceDataRetriever {

    /**
     * Creates an instance of list containing active JobProfile.
     * 
     * @return List contains JobProfile.
     */
    public static List<JobProfile> getJobProfileWithAllActiveJobs(){
        List<JobProfile> JobProfiles = new ArrayList<JobProfile>();
        for(int i=1;i<=6;i++){
            JobProfile profile = new JobProfile.ProfileBuilder().jobId(i)
            .cpuUsage(80+i).memoryUsage(40+i).ipAddress("192.1.12.4"+i).isActive(true)
            .build();
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        JobProfiles.add(profile);
        System.out.println(JobProfiles.size());
        }
        return JobProfiles;
    }
}

2 个答案:

答案 0 :(得分:0)

每次添加到表格时调用tableViewer.refresh()

您必须先致电tableViewer.setInput,然后才能致电refresh

如果您在后台线程中运行,则必须使用Display.asyncExec在UI线程中运行refresh调用。

答案 1 :(得分:0)

在你的创建零件控制方法中添加这一串代码,在这里输入代码,这可能会对你有帮助

ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() {

    @Override
    public void resourceChanged(IResourceChangeEvent event) {
        treeViewer.refresh();
    }
});