如何从对象创建/引用另一个对象?

时间:2015-12-10 08:15:27

标签: java user-interface object

这里有新问题所以我可能会错误地思考它,因为我对物体不是很有经验。 我有一个27x27的对象网格,我这样创建:

Square grid[][] = new Square[27][27];

现在,我需要通过方法Environment1将每个对象放入一个名为add(ColonyNode, int int)的容器中,每个Square引用一个ColonyNode对象,然后通过上述方法将每个ColonyNode添加到Environment1容器中。 ColonyNodeView add方法处理它们在容器中的放置方式,因此处理2 int个参数。我只是无法弄清楚如何将Square Objects与ColonyNode对象链接起来并且正在寻找想法。

到目前为止我尝试过但没有奏效的是:

for(int i = 0; i<grid.length; i++){
        for(int j = 0; j <grid[i].length; j++){
            ColonyNodeView newSquare = new ColonyNodeView();
            Environment1.add(newSquare, i, j);
        }
    }

好的,我会尽力解释这部分计划的总体目标。 Environment1是一个GUI容器,每个ColonyNode将添加到该容器中以显示为网格。 现在,每个Square都由程序的其余部分更新为某些变量值。然后,我希望每个方块引用一个ColonyNode,以便整个GUI(environment1)可以将该信息推送到它上面。

2 个答案:

答案 0 :(得分:2)

让我试着帮助你,但我会以多种方式解释你的问题。

让我们看一下这句话“每个Square引用一个ColonyNode”。这似乎使问题含糊不清。

首先,如果您尝试引用 grid 数组中的任何数据,您将获得NullPointerException。如果您愿意,首先使用构造函数初始化该数组中的每个Object。
所以你应该做的第一个改变是:

grid[i][j]=new Square(); //Initializing the object. An object must be initialized before you can use it

现在,由于您希望grid[i][j] Square对象成为ColonyNodeView的一部分,因此只需添加一个构造函数,该构造函数将Square对象作为参数。我认为你需要的总体是这样的:

class ColonyNodeView
{
    //rest of your variables and references here
    Square sq; //Added a reference for a 'Square' object
    ColonyNodeView(Square a){
        this.sq=a;
    }
}

//In the other module
for(int i = 0; i<grid.length; i++){
        for(int j = 0; j <grid[i].length; j++){
            grid[i][j]=new Square(); //Initialize it
            ColonyNodeView newSquare = new ColonyNodeView(grid[i][j]);
            //You have now 'linked' the square with the ColonyNodeView. 
            //you can access it by 'newSquare.sq'
            Environment1.add(newSquare, i, j); //Add the ColonyNodeView linked with the Square to Environment. Looks fine now
        }
    }

答案 1 :(得分:1)

令人困惑的阅读,但从我的理解,听起来你需要在Environment1内维持一个方格网格。也许以下结构可以帮助您:

public class Environment(){
    Square [][] grid;
    public Environment(int i, int j){
        grid = new Square[i][j]
    }
    public void setSquare(int i, int j, ColonyNodeView c){
        grid[i][j] = c;
    }
    public Square getSquare(int i, int j){
        return grid[i][j]
    }
}

现在有趣的部分。你可以这样:

public class Square{
}
public class ColonyNodeView extends Square{
}

或者你可以一起摆脱sqaure类,内部环境有ColonyNodeView

public class Environment(){
    ColonyNodeView [][] grid;
    public Environment(int i, int j){
        grid = new ColonyNodeView[i][j]
    }
    etc . . . 
}

<强>替代

您也可以将ColonyNodeView放在Square内。所以你可以拥有以下内容:

public class Square(){
    ColonyNodeView v;
    public Square(ColonyNodeView v){
        this.v = v
    }
    //Sets and Gets
}

然后当你致电setSquare时。您将执行以下操作:

public void setSquare(int i, int j, ColonyNodeView c){
    grid[i][j].setColony(c);
}

当然,使用这种方法,您必须确保网格正确初始化。