java - 为什么我的 JComponent 不绘制图像?

标签 java image swing jpanel jcomponent

我现在正在开发一款游戏,到目前为止进展顺利,但现在遇到了麻烦。我有一个 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时我都会打印它并且它确实打印了。唯一的问题是它不会把它画在面板上。我唯一的猜测是构造函数正在阻止它绘画。

最佳答案

有一些基本问题...

  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) 期望引用是磁盘上的文件,该文件与程序的执行上下文相关

根据您想要实现的目标,您可能希望考虑编写自己的布局管理器,您可以使用它来控制子组件的位置,或者编写一个“游戏表面”,您可以使用自定义绘画来绘制游戏状态

关于java - 为什么我的 JComponent 不绘制图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21445691/

相关文章:

java - 自动更新jtextfield

java - Derby - 如何处理目标字段的添加

java - 空 EntityManager Spring 4

java - Orika 多态映射

带有彩色框轮廓的图像上的CSS透明文本

java - 使用 iText 5 或 7 将图像层添加到 pdf

JavaScript 图像隐藏

java - 查询显示额外行

java - 整个应用程序中的全局键绑定(bind)可通过 ctrl+h 打开 chm 文件

java - 组合 getSelectedItem 但然后