1

我的项目有问题:/

为什么 drawPac 不能正常工作。黑色矩形正在绘制,但我的图像不是:/为什么

我做了4个类,这里​​是3个类的鳕鱼,没有扩展JFrame的主类,并且添加了JPanel Game。

文件 #1

package pacman;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

public class Game extends JPanel { 

   Pac pacman = new Pac();

   public void Game() {
     setFocusable(true);
     setBackground(Color.BLACK);
     setDoubleBuffered(true);
   }

@Override
public void paint(Graphics g){
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.black);
    g2d.fillRect(0, 0,this.getWidth(),this.getHeight());
    drawPac(g2d);
}

public void drawPac(Graphics2D g2d){
    g2d.drawImage(pacman.image, pacman.x, pacman.y, 100, 100, this);
    }
}

文件 #2

package pacman;
import java.awt.Image;
import javax.swing.ImageIcon;

public class Actor {
    int x,y;
    int dv;
    Image image;
    public void Actor(){
    }
}

文件 #3

package pacman;
import pacman.Game;
import javax.swing.ImageIcon;
import java.awt.Graphics2D;

public class Pac extends Actor {

public void Pac(){

    try{
    image = new ImageIcon(Pac.class.getResource("../img/Pac00.gif")).getImage(); 
    x=0;
    y=0;
        }
    catch (Exception e){
        System.out.println("Blad prz otwieraniu");
        System.exit(0);  }
 }

}
4

2 回答 2

2

1 - “Pac”类应该负责绘制本身,你不同意吗?

2 - 对于 JPanel 和每个 JComponent 的儿子,您应该重写paintComponent 方法,而不是paint,它负责将绘画工作委托给paintComponent、paintBorder 和paintChildren。您也应该调用paintComponent 的超级版本,就像在paint 中所做的那样。看看文档。

3 - 在大多数情况下,建议创建一个新的图形上下文(基于原始)。所以,你的行:

Graphics2D g2d = (Graphics2D) g;

应替换为:

Graphics2D g2d = (Graphics2D) g.create();

并且您需要在使用它后(在paintComponent 的最后一行)处理(g2d.dispose())这个新上下文。

4 - Pac 类的代码是否正确?是在编译吗?image 字段是 Actor 的成员吗?

我认为您的代码中有一些问题没有在您的问题中显示...

于 2012-05-16T23:38:20.847 回答
-1

好的@lechniak更新游戏类

public class Game extends JPanel { 
 Pac pacman = new Pac();

public Game() {
  setFocusable(true);
  setBackground(Color.BLACK);
  setDoubleBuffered(true);
}
@Override
public void paint(Graphics g){
   super.paint(g);
   Graphics2D g2d = (Graphics2D) g;
   g2d.setColor(Color.black);
   g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
   drawPac(g2d);
}

public void drawPac(Graphics2D g2d){
   g2d.drawImage(pacman.image, pacman.x, pacman.y, 200, 200, this);
}

public static void main(String[] args) {
     JFrame f = new JFrame("Image Draw");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new Game());
        f.setSize(350,300);
        f.setLocation(300,300);
        f.setVisible(true);
 }
}

和 Pac 类

//import javax.swing.ImageIcon;
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import javax.imageio.ImageIO;
import java.io.*;

public class Pac /*extends Actor*/ {
   int x = 0;
   int y = 0;
   BufferedImage  image;

       public Pac() {
          try {
            image = ImageIO.read(new File("/Users/hlozano/java/swing/programmerBorn.jpg"));
            //new ImageIcon(Pac.class.getResource("../img/Pac00.gif")).getImage();
            x = 0;
            y = 0;
           } catch (Exception e) {
            System.out.println("Blad prz otwieraniu " + e);
            System.exit(0);
               }
       }
}

和图像输出

在此处输入图像描述

我希望这些有帮助。

于 2012-05-16T23:30:33.707 回答