Search code examples
javaswinggraphicsgraphics2d

Graphics not displaying on JFrame


I'm am new to graphics in java and for some reason the graphics are not displaying on the jframe. I am confused of how to set up and instantiate the graphics. There could also be a stupid error in the code that im just not seeing. Thanks for any feedback!

Map Class

public class Map extends JPanel{

private static int WIDTH;
private static int HEIGHT;
private static int ROWS;
private static int COLS;
private static int TILE_SIZE;
private static int CLEAR = 0;
private static int BLOCKED = 1;

private static int[][] GRID;

public Map(int w, int h, int t){

    WIDTH = w;
    HEIGHT = h;
    TILE_SIZE = t;
    ROWS = HEIGHT/TILE_SIZE;
    COLS = WIDTH/TILE_SIZE;

    GRID = new int[ROWS][COLS];

    for (int row = 0; row < ROWS; row++){
        for (int col = 0; col < COLS; col++){
            GRID[row][col] = BLOCKED;
        }
    }

    randomMap();
}

public void randomMap(){
    int row = 0;
    int col = 0;
    int turn;

    Random rand = new Random();

    GRID[row][col] = CLEAR;

    do{
    turn = rand.nextInt(2)+1;
    if (turn == 1)
        row++;
    else
        col++;
    GRID[row][col] = CLEAR;
    }while(row<ROWS-1 && col<COLS-1);

    if (row == ROWS-1){
        for (int i = col; i < COLS; i++){
            GRID[row][i] = CLEAR;
        }
    }
    else{
        for (int i = row; i < ROWS; i++){
            GRID[i][col] = CLEAR;
        }
    }


}


public void paintComponent(Graphics g) {

    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;

    for (int row = 0; row < WIDTH; row++){
        for (int col = 0; col < HEIGHT; col++){
            if (GRID[row][col] == 1){
                g2d.setColor(Color.BLACK);
                g2d.fillRect(row*TILE_SIZE, col*TILE_SIZE, TILE_SIZE, TILE_SIZE);
            }else{
                g2d.setColor(Color.WHITE);
                g2d.fillRect(row*TILE_SIZE, col*TILE_SIZE, TILE_SIZE, TILE_SIZE);
            }
        }
    }
}

public void displayConsole(){

    for (int row = 0; row < ROWS; row++){
        for (int col = 0; col < COLS; col++){

            System.out.print(GRID[row][col] + "   ");
        }
        System.out.println("");
        System.out.println("");
    }
}

}

Game Class

public class Game extends JFrame{

private Map map;

public Game(){

    setLayout(null);
    setBounds(0,0,500,500);
    setSize(500,500);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Map map = new Map(500,500,50);
    map.displayConsole();

    add(map);
    repaint();
    setVisible(true);
}

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Game game = new Game();

}

}

Solution

  • It is likely the painted component is of size 0x0. A custom painted component should return the preferred size of the component.

    After the component is added to a frame, pack the frame to ensure the frame is the exact size needed to display the component.

    Of course, either use or set an appropriate layout/constraint in the frame. In this case, I would use the default layout of BorderLayout and the default constraint of CENTER.