Java 可能的线程问题?
我有两个类,一个是datamodel类,另一个是gui类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); }
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代码以了解为什么不创建查看器?