The reason I’m asking is because I’m getting NullPointerException.
I now this is very easy but I’m pretty new programming and find this a bit confusing.
So say I have initialized an object in a class and want to access that same object from another class.
Like now for instance I’m working on a small Chess game, in my model Game class I have an instance of Board, an object. Board, in turn, has an array of Squares. Square[][].
Game has board, board has Square[][].
Now if I want to access the Square[][] through the object board (in Game) of type Board.
Do I just declare a variable with the same name and type or do I have to initialize it again?
Board board OR Board board = new Board();
Note, I have already initialized board in the class Game so if I do it again, won’t they be two totally different Board objects?
The class that refers to “board”:
public class View extends JFrame {
Board board;
JFrame gameWindow = new JFrame("Chess");
JPanel gamePanel = new JPanel();
JPanel[][] boardPanel = new JPanel[8][8];
JMenuBar gameMenu = new JMenuBar();
JButton newGame = new JButton("New game");
JButton pauseGame = new JButton("Pause");
JButton actionLog = new JButton("Action log");
View(){
gameWindow.setDefaultCloseOperation(EXIT_ON_CLOSE);
gameWindow.setSize(400, 400);
gameWindow.getContentPane().add(gamePanel);
gameWindow.setVisible(true);
gamePanel.setVisible(true);
gameMenu.add(newGame);
gameMenu.add(pauseGame);
gameMenu.add(actionLog);
for(JPanel[] row : boardPanel){
for(JPanel box : row){
gamePanel.add(box);
}
}
}
public void drawBoard(){
for(int y = 0; y < 8; y++){
for(int x = 0; x < 8; x++){
Box box = new Box();
box.setColour(board.getSquare(x, y).getColour());
box.setCol(x);
box.setRow(y);
box.repaint();
boardPanel[x][y].add(box);
}
}
}
}
class Box extends JComponent{
JPanel[][] boardPanel;
Board board;
Color boxColour;
int col, row;
public Box(){
repaint();
}
public void paint(Graphics drawBox){
drawBox.setColor(boxColour);
drawBox.drawRect(50*col, 50*row, 50, 50);
drawBox.fillRect(50*col, 50*row, 50, 50);
}
public void setColour(Color boxColour){
this.boxColour = boxColour;
}
public void setCol(int col){
this.col = col;
}
public void setRow(int row){
this.row = row;
}
}
…and the class that instantiates “board”:
public class Game {
@SuppressWarnings("unused")
public static void main(String[] args)
throws Throwable{
Board board = new Board();
View view = new View();
}
}
Exception happens here:
for(JPanel[] row : boardPanel){
for(JPanel box : row){
gamePanel.add(box);
}
}
Yes, you’ll then have two totally different instances. You’re getting the basic idea – you have instances of objects in your program and now you have to get them to work together.
You have 2 ways to give Game access to the squares (probably more than just 2 depending on how you look at it):
1 Have the Board provide access to the Squares (e.g. a getter method on Board that returns the Squares array) so Game can access them. Board can then save the reference (have its own instance variable to hold the reference to squares, or can ask Board each time for the reference).
2 Have the Board provide methods that do the things that Game wants to do on the the squares, i.e. the game asks the board to do something to the squares and the board does the action on the squares.