JFrame 上不显示图形

Graphics not displaying on JFrame

我是 java 中的图形新手,由于某种原因图形未显示在 jframe 上。我对如何设置和实例化图形感到困惑。代码中也可能存在我只是没有看到的愚蠢错误。感谢您的任何反馈!

地图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("");
    }
}

}

游戏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();

}

}

很可能绘制的组件的大小为 0x0。自定义绘制的组件应该 return 组件的首选大小。

将组件添加到框架后,打包框架以确保框架的大小恰好是显示组件所需的大小。

当然,在框架中使用或设置适当的layout/constraint。在这种情况下,我会使用默认布局 BorderLayout 和默认约束 CENTER.

安德鲁是正确的。我不得不重新布局才能让它工作。我添加了 perferredSize()minimumSize() 的代码,并添加了对 pack() 的调用并删除了 setLayout(null)。此外,您在计算 HEIGHT 和 WIDTH 时遇到问题,它们不会与 ROWS 和 COLS 对齐,并且会抛出 Index Out Of Bounds。

更正了下面的代码。

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 );
      pack();
      repaint();
      setVisible( true );
   }

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

      Game game = new Game();


   }

}

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;

   }

   @Override
   public Dimension preferredSize()
   {
//      return super.preferredSize(); //To change body of generated methods, choose Tools | 
      return new Dimension( WIDTH, HEIGHT );
   }

   @Override
   public Dimension minimumSize()
   {
      return preferredSize();
   }




   public void paintComponent( Graphics g )
   {

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

      for( int row = 0; row < ROWS; row++ )
         for( int col = 0; col < COLS; 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( "" );
      }
   }
}