2012-03-23 74 views
1

基本概要:處理一個產生15x15網格的遊戲,供玩家在網格中移動。網格中的每個單元格都是隨機生成的圖像,其顏色爲棕色,因此每個單元格看起來不同。唯一的問題是我試圖爲包含隨機系列顏色的每個單元格創建一個緩衝圖像。我在Dirt類中的問題是它不會調用paintComponent方法。這是Dirt類。 (在構造函數中的細胞的矩形通過)Java面板不會繪製

package game; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Rectangle; 
import java.awt.image.BufferedImage; 
import javax.swing.JPanel; 

public class Dirt extends JPanel{ 
    private Rectangle rect; 
    private BufferedImage image; 
    private int pixelSize; 

    public Dirt(Rectangle x){ 
     rect = x; 
     image = new BufferedImage(rect.width, rect.width, BufferedImage.TYPE_INT_RGB); 
     pixelSize = rect.width/15; 
     setVisible(true); 
     validate(); 
     this.repaint(); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     Graphics2D g2d = image.createGraphics(); 
     Rectangle[][] rects = new Rectangle[15][15]; 
     Color[] colors = {new Color(160,82,45),new Color(139,69,19),new Color(165,42,42)}; 
     java.util.Random randomGenerator = new java.util.Random(); 
     for(int i = 0; i < 15; i++){ 
      for(int j = 0; j < 15; j++) 
       rects[i][j] = new Rectangle(pixelSize*i,pixelSize*j,pixelSize,pixelSize); 
     } 
     for(int i = 0; i < 15; i++){ 
      for(int j = 0; j < 15; j++){ 
       System.out.println(i + " " + j); 
       g2d.setColor(colors[randomGenerator.nextInt(3)]); 
       g2d.fillRect(rects[i][j].x, rects[i][j].y, rects[i][j].width, rects[i][j].height); 
      } 
     } 
     g2d.dispose(); 
    } 

    public Image getImage(){return image;} 
    public Rectangle getRect(){return rect;} 
} 
+3

我懷疑問題可能是你的畫,而不是傳入的圖形g,而是在該方法內創建的圖形。 – 2012-03-23 00:41:02

+0

我把system.out.print作爲printcomponent方法的第一行,並且不被調用。我認爲它根本不會去漆畫。 – mbreen 2012-03-23 01:01:03

回答

2

以下內容添加到您的paintComponent方法的末尾:

g.drawImage(image, 0, 0, this); 

像@Carl Manaster說,在他的評論,你吸引到緩衝的圖像,但是您沒有將緩衝圖像繪製到傳遞給paintComponent方法的Graphics對象中。

編輯:添加以下到您的類進行測試,幷包含上文中的paintComponent方法我的代碼行,它爲我工作:

public static void main(String args[]) { 
    JFrame f = new JFrame(); 

    f.addWindowListener(new WindowAdapter() { 

     @Override 
     public void windowClosing(WindowEvent e) { 
      System.exit(0); 
     } 

    }); 

    f.getContentPane().setLayout(null); 

    Dirt d = new Dirt(new Rectangle(40, 40)); 
    d.setBounds(20, 20, 64, 64); 
    f.getContentPane().add(d); 

    f.setSize(300, 300); 

    f.setVisible(true); 
} 
+0

那麼我想要做的是生成一個bufferedImage,然後我返回到我的板類。 – mbreen 2012-03-23 01:08:10

+0

太好了!我在董事會課上做了類似的事情(剛纔意識到我從來沒有在板上添加污垢......)。感謝您指出我的方向!全部修好! – mbreen 2012-03-23 01:27:40