我现在正在开发一款游戏,到目前为止进展顺利,但现在遇到了麻烦。我有一个 JFrame。我给它添加了一个 JPanel。 JPanel 由三个用于绘制图片的 JComponent 组成。这是我的代码:(请注意,并未显示我方法中的所有内容)
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时我都会打印它并且它确实打印了。唯一的问题是它不会把它画在面板上。我唯一的猜测是构造函数正在阻止它绘画。
最佳答案
有一些基本问题...
JPanel
默认情况下,使用FlowLayout
FlowLayout
使用组件的首选大小来确定如何布局它所管理的组件- 您的组件不会覆盖
getPreferredSize
,这意味着它们将返回0x0
- 默认情况下,
JPanel
是不可聚焦的,因此向其添加KeyListener
并请求焦点效果甚微。您应该考虑使用 Key Bindings相反 JLabel
提供对绘制Icon
的支持。您可以将Image
包装在ImageIcon
中,并将其与JLabel
一起使用,以更简单地绘制图像ImageIcon("resources/ball.png")
表明相关图像作为文件存储在磁盘上,但路径表明它们可能是嵌入资源。ImageIcon(String)
期望引用是磁盘上的文件,该文件与程序的执行上下文相关
根据您想要实现的目标,您可能希望考虑编写自己的布局管理器,您可以使用它来控制子组件的位置,或者编写一个“游戏表面”,您可以使用自定义绘画来绘制游戏状态
关于java - 为什么我的 JComponent 不绘制图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21445691/