图形未显示在Jframe上



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

地图类

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

游戏类

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。自定义的彩绘组件应返回组件的首选尺寸。

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

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

安德鲁是正确的。我不得不重新进行布局以使其工作。我添加了perferredSize()minimumSize()的代码,并向pack()添加了一个调用并删除了setLayout(null)。另外,您有一个问题来计算自己的身高和宽度,它们不会排成一行和col,并且会从范围中丢弃索引。

校正的代码下面。

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

相关内容

  • 没有找到相关文章

最新更新