2012-03-23 76 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