我现在正在制作一款游戏并且到目前为止表现不错,但我现在遇到了麻烦。我有一个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并打印时,我都会打印它。唯一的问题是它不会在面板上绘制它。我唯一的猜测是构造函数阻止它绘画。
答案 0 :(得分:3)
有一些基本问题......
JPanel
使用FlowLayout
FlowLayout
使用组件的首选大小来确定如何布置它正在管理的组件getPreferredSize
,这意味着他们将返回0x0
JPanel
无法关注,因此向其添加KeyListener
并请求关注将会做很少的事情。您应该考虑使用Key Bindings代替JLabel
支持绘制Icon
。您可以将Image
包裹在ImageIcon
添加中,并使用JLabel
更简单地绘制图像ImageIcon("resources/ball.png")
表示所讨论的图像作为文件存储在磁盘上,但路径表明它们可能是嵌入的资源。 ImageIcon(String)
期望引用是磁盘上的文件,它相对于程序的执行上下文而言根据您想要实现的目标,您可能希望考虑编写自己的布局管理器,您可以使用它来控制子组件的位置,或者编写一个“游戏表面”,您可以使用自定义绘画来绘制游戏状态