可能的线程问题?

时间:2012-10-16 17:13:56

标签: java swt refresh tableviewer

我有2个类,一个类是datamodel类,另一个类是gui类。

class datamodel .........

获取用户选择的数据并创建一个arraylist

class gui .........

有一个tableviewer正在使用datamodel类中的数组

我的问题是,当用户向阵列添加更多数据时,我需要刷新tableviewer。

我在gui类中创建了一个updateTableViewer方法。

public void updateTableViewer() {
  if(getViewer() != null) {
     viewer.refresh();
 {

然后我在datamodel类中引用了gui类。

AplotBaseDialog abd = new AplotBaseDialog(null, null);

然后我将方法调用添加到向数组中添加更多数据的方法

public void add(TCComponentItemRevision tcRevision, TCComponentDataset selectedDataset) {
  AplotDatasetData pp = new AplotDatasetData(tcRevision, selectedDataset);
  if (!dataArrayList.contains(pp)) {
     dataArrayList.add(pp);
  }
  abd.updateTableViewer();

}// end add()

这不起作用。即使创建并打开了gui类,getViewer()调用也始终返回null。

所以我创建了一个布尔值;

Boolean hasViewerBeenCreated = false;

创建tableviewer后,我将值设置为true。

viewer = new AplotDataTableViewer(parent, SWT.BORDER|SWT.V_SCROLL|SWT.FULL_SELECTION);
  viewer.setInput(AplotDataModel.getInstance().getArrayData());
  hasViewerBeenCreated = true;  

然后我创建了一个返回布尔值的方法。

我从dailog上的一个按钮调用该方法。 我还替换了datamodel类中的updateTableViewer方法调用

if (!dataArrayList.contains(pp)) {
     dataArrayList.add(pp);
  }
  abd.getBooleanValue();
}

以下是结果。

我在datamodel类中执行add方法 - 它返回false - 这是有道理的,因为此时尚未创建dailog

我执行并创建了gui类 我点击按钮,它返回true - 这是有道理的,因为已经创建了查看器

这是我感到困惑的地方。 在gui仍然打开的情况下,我可以再次执行add方法,它仍会返回false值。然后我可以单击按钮,看它是真正的价值。

我认为当创建gui并将boolean值设置为true时。我可以在其他类中获取布尔值的当前值。

我不确定我是否没有正确引用gui类或者创建gui时我没有访问当前的线程或tableviewer?

我不知道这是一个线程问题,还是我没有正确地从gui获取当前值。

这是我的应用程序现在的一个大问题。每当新数据添加到阵列时,我都必须能够刷新tableviewer。每次选择新数据时,我都不能让用户手动刷新表

0 个答案:

没有答案