我还是Java和Vaadin的新手,在尝试使用组件填充选项卡时,我很难理解如何解决空点异常。我在哪里拧?我知道问题出在我的ObjList为空...但是我不确定如何解决。请参见以下代码:

主类:

public class Main extends Application {
    private ObjList objList = null;
    private ObjContainer dataSource = ObjContainer.createData();

private TabWindow tabWindow = new TabWindow(objList);

public void init() {
    buildmainlayout();
}

private void buildmainlayout() {
    setMainWindow(new Window("Test"));
    VerticalLayout layout = new VerticalLayout();
    layout.setSizeFull();
    layout.addComponent(tabWindow);
    getMainWindow().setConent(layout);
}

private TabWindow getTabWindow() {
    if(tabwindow == null) {
        objList = new ObjList(this);
        tabWindow = new TabWindow(objList);
    }
    return tabWindow;
}
public ObjContainer getDataSource() {
    return dataSource;
}
}


ObjList类别:

public class ObjList extends Table {
    public ObjList (Main app) {
        setSelectable(true);
        setImmediate(true);
        setContainerDataSource(app.getDataSource());
        setColumnHeaders(ObjContainer.COL_HEADERS_ENGLISH);
        setVisibleColumnsw(ObjContainer.NATURAL_COL_ORDER);
}
}


TabWindow类别:

public class TabWindow extends TabSheet implements TabSheet.SelectedTabChangeListener {
    private TabSheet t;
    public TabWindow(ObjList objList) {
        VerticalLayout l1 = new VerticalLayout();
        l1.setMargin(true);
        l1.addCOmponent(new Label("A"));
    t= new TabSheet();
    final Tab a = t.addTab(l1, "A", null));
    addComponent(t);
}
public void selectedTabChange(SelectedTabChangeEvent event){
    TabSheet tabsheet = event.getTabSheet();
    Tab tab = tabsheet.getTab(tabsheet.getSelectedTab());
    if (tab != null) {
         getWindow().showNotification("Selected tab" + tab.getCaption());
    }
 }
}


谢谢!

最佳答案

我怀疑问题是由于您如何在Main类的隐式构造函数中初始化对象图。

private ObjList objList = null;
private ObjContainer dataSource = ObjContainer.createData();

private TabWindow tabWindow = new TabWindow(objList);


当创建tabWindow并将objList传递给构造函数时,它将引用复制到null。当您随后在代码中稍后初始化objList时,它仅会具体影响该字段,而不会影响tabWindow内部的引用,因为这时它们是完全分开的。您需要重新安排初始化逻辑,以确保在将objList传递给另一个对象之前,它引用了真实的东西。

所有这些都与如何在Java中传递引用有关,有关以下主题的更多信息,请参见此问题:Is Java "pass-by-reference" or "pass-by-value"?

08-03 23:33