Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可能的线程问题?_Java_Swt_Refresh_Tableviewer - Fatal编程技术网

Java 可能的线程问题?

Java 可能的线程问题?,java,swt,refresh,tableviewer,Java,Swt,Refresh,Tableviewer,我有两个类,一个是datamodel类,另一个是gui类 public void updateTableViewer() { if(getViewer() != null) { viewer.refresh(); { 类数据模型 获取用户选择的数据并创建arraylist 类gui 具有使用datamodel类中的数组的tableviewer if (!dataArrayList.contains(pp)) { dataArrayList.add(pp); }

我有两个类,一个是datamodel类,另一个是gui类

public void updateTableViewer() {
  if(getViewer() != null) {
     viewer.refresh();
 {
类数据模型

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

类gui

具有使用datamodel类中的数组的tableviewer

if (!dataArrayList.contains(pp)) {
     dataArrayList.add(pp);
  }
  abd.getBooleanValue();
}
我的问题是,当用户向数组添加更多数据时,我需要刷新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()
这是行不通的。getViewer()调用始终返回null,即使gui类已创建并打开

所以我创建了一个布尔值

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方法,它仍然返回一个假值。然后我可以点击按钮,看看它是真值

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

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

我不知道这是否是线程问题,或者我只是没有正确地从gui获取当前值


这是我现在申请的一个大问题。我必须能够在向数组添加新数据时刷新tableviewer。我不能让用户在每次选择新数据时都手动刷新表

在哪里声明了“getViewer”方法以及它在做什么?我强烈怀疑您有一些字段被同名的局部变量遮住了,所以它总是空的。getViewer在gui类中,它仅在从singleton类执行时返回空。当从gui类执行时,它可以正常工作。我将方法getViewer设置为static,这适用于我上面的问题。如果没有看到getViewer代码,就无法理解它返回null的原因。您是否调试了init代码以了解为什么不创建查看器?