为什么我的JComponent没有绘制图像?

时间:2014-01-30 00:36:05

标签: java image swing jpanel jcomponent

我现在正在制作一款游戏并且到目前为止表现不错,但我现在遇到了麻烦。我有一个JFrame。我添加了一个JPanel。 JPanel由三个应该绘制图片的JComponents组成。这是我的代码:(请注意,我的方法并未显示所有内容)

public class Game extends JFrame implements KeyListener {

public static Game g;

public JPanel pan;

Paddle p1;
Paddle p2;
Ball ball;

public int p1Y = 0;
public int p2Y = 0;

public int ballY = 300;

public Game() {
    setTitle("Game");
    setSize(600, 600);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setResizable(false);

    pan = new JPanel();
    pan.setBackground(Color.BLACK);
    p1 = new Paddle(0, p1Y);
    p2 = new Paddle(600, p2Y);
    ball = new Ball(300, ballY);
    pan.add(p1);
    pan.add(p2);

    add(pan);
    setVisible(true);

    pan.addKeyListener(this);
    pan.requestFocus();
}

public static void main(String args[]) {
    g = new Game();
}

此方法设置一切。我还有两种方法可以绘制图像。

class Paddle extends JComponent {

public Image img = new ImageIcon("resources/paddle.png").getImage();

public int x;
public int y;

public Paddle(int x, int y) {
    this.x = x;
    this.y = y;
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, x, y, this);
}
}




class Ball extends JComponent {

public Image img = new ImageIcon("resources/ball.png").getImage();

public int x;
public int y;

public Ball(int x, int y) {
    this.x = x;
    this.y = y;
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, x, y, this);
}
}

每当调用paintComponent并打印时,我都会打印它。唯一的问题是它不会在面板上绘制它。我唯一的猜测是构造函数阻止它绘画。

1 个答案:

答案 0 :(得分:3)

有一些基本问题......

    默认情况下,
  1. JPanel使用FlowLayout
  2. FlowLayout使用组件的首选大小来确定如何布置它正在管理的组件
  3. 您的组件未覆盖getPreferredSize,这意味着他们将返回0x0
  4. 默认情况下,JPanel无法关注,因此向其添加KeyListener并请求关注将会做很少的事情。您应该考虑使用Key Bindings代替
  5. JLabel支持绘制Icon。您可以将Image包裹在ImageIcon添加中,并使用JLabel更简单地绘制图像
  6. ImageIcon("resources/ball.png")表示所讨论的图像作为文件存储在磁盘上,但路径表明它们可能是嵌入的资源。 ImageIcon(String)期望引用是磁盘上的文件,它相对于程序的执行上下文而言
  7. 根据您想要实现的目标,您可能希望考虑编写自己的布局管理器,您可以使用它来控制子组件的位置,或者编写一个“游戏表面”,您可以使用自定义绘画来绘制游戏状态