实例化ObservableList?

时间:2011-01-20 12:30:22

标签: java eclipse observable eclipse-databinding

我想了解ObservableListRealms的概念。我试图像这样创建一个ObservableList的实例:

  public ObservableList createObservableList() {
    ObservableList myObsList = new ObservableList(new ArrayList<String>(),
        "test") {
    };

    return myObsList;
  }

但是当我调用这种方法时,我得到了:

org.eclipse.core.runtime.AssertionFailedException: null argument:Realm cannot be null
 at org.eclipse.core.runtime.Assert.isNotNull(Assert.java:85)

我知道这有一些事情要做,我们没有设置默认域。但是,我在哪里可以找到有关这些概念的文档?

我看过这个:

http://wiki.eclipse.org/JFace_Data_Binding/Observable

http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/databinding/observable/list/ObservableList.html

...但它包含非常有限的信息/示例。

我也有Eclipse EMF书,但找不到任何如何使用的例子。 ObservableList

我在哪里可以找到有关Observable背后的规则/概念的教程/文档?

我现在尝试了以下内容:

  public static ObservableList createObservableList() {
    ObservableList myObsList = null;
    Realm.getDefault().exec(new Runnable() {
      @Override
      public void run() {
        myObsList = new ObservableList(new ArrayList<String>(), "test") {
        };
      }
    });
    return myObsList;
  }

...但是这不起作用,因为myObsList必须是最终的。将其更改为final会使其无法在run方法中更新它。

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

未设置领域是默认值。如果默认域可用,您可以测试:

if (Realm.getDefault() == null) {

并在必要时设置Realm(用于当前线程):

   Realm.setDefault(new Realm());
}

(JFace数据绑定是一项挑战......)

答案 1 :(得分:2)

您可以使用静态方法

SWTObservables.getRealm(display)

获取与给定显示的UI线程关联的Realm。 Realm的API页面提供一些提示肯定会很好。

答案 2 :(得分:1)

嗯,我同情,Eclipse API有时是一个奇怪的工作。

我在JFaces FAQ中找到了这个:

http://wiki.eclipse.org/JFace_Data_Binding_FAQ#What_is_a_Realm.2C_and_do_I_need_to_care.3F

看起来你可以使用以下方式在域中运行:

Realm.exec(Runnable runnable)

所以尝试从Runnable块中创建可观察列表。希望有所帮助。

请参阅:

http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/databinding/observable/Realm.html

如果我们拥有用户友好的URL的Eclipse人员会很好!

答案 3 :(得分:1)

  1. 让您的主类实现Runnable inerface。
  2. 将所有逻辑移至run()方法
  3. 在静态主方法中调用Realm.runWithDefault()

    Main main = new Main();  
    Realm realm = SWTObservables.getRealm(Display.getDefault());  
    //for JFace data binding  
    Realm.runWithDefault(realm, main);