2015-05-11 71 views
2

我是java中的图形新手,出于某种原因,图形没有显示在jframe上。我很困惑如何设置和实例化图形。在我看不到的代码中也可能有一个愚蠢的错误。感谢您的任何反馈!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(); 

} 

} 
+2

'setLayout(null);'Java GUIs必须在不同的操作系统上工作,屏幕大小,屏幕分辨率等等,在不同的语言环境中使用不同的PLAF。因此,它们不利于像素的完美布局。请使用布局管理器或[它们的组合](http://stackoverflow.com/a/5630271/418556)以及[white space]的布局填充和边框(http://stackoverflow.com/a/17874718/ 418556)。 –

+0

'公共类游戏扩展JFrame {'Ugghh ..我正要将这两个类变成一个单独的MCVE ..你知道我有多少源代码叫做'游戏'吗?由于我在我的IDE中预留了一个用于测试垃圾代码的包,这意味着我需要在继续之前删除另一个示例。请使课程名称具有描述性和独特性。一种方法是将您的姓名添加到游戏名称中。你可以打赌我没有其他的代码在这里称为公共类PeterCinibulkGame扩展JFrame {'.. –

回答

4

这是有可能的画组件尺寸为0x0的。自定义绘制的组件应该返回组件的首选大小。

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

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

1

安德鲁是正确的。我不得不重新布局才能使其发挥作用。我添加了代码perferredSize()minimumSize(),并且我添加了对pack()的呼叫并删除了setLayout(null)。此外,计算高度和宽度时遇到问题,它们不与ROWS和COLS对齐,并且会抛出Index Out。

更正后的代码如下。

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

heh,heh ..没有向下滚动,我读作为'类扩展JPanel'而不是'class Map extends JPanel' –

+1

'在这种情况下,毛泽东的阶级会是一个很古怪的阶级名称。我认为他在数组索引中的错误是一个概念错误:他使用WIDTH和HEIGHT作为边界,但是这些太大了,比他计算的ROWS和COLS大得多。 – markspace

+0

*“在这种情况下,”毛泽东班“将是一种奇怪的班级名称。”*当然,“毛泽东班”至少会(几乎保证)独一无二! ;) –