2014-01-30 24 views
0

我现在正在进行一场比赛,迄今一直表现不错,但我现在遇到了麻烦。我有一个JFrame。我添加了一个JPanel。 JPanel由三个应该绘制图片的JComponent组成。这里是我的代码:(请注意,并非所有方法都显示)为什么我的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并且它确实打印,我都会打印它。唯一的是它不会在面板上绘制它。我唯一的猜测是构造函数正在阻止它的绘画。

+0

调试时间。你是否在正确的地方寻找图像?你确定?你打印出user.dir只是为了检查?你检查过它是否为空?此外,通常最好将图像作为资源,而不是像你所做的那样作为文件。 –

+0

它们不为空,路径正确。我设法绘制一幅图像。其他图像不会画出。 – user3183865

+0

好,那是我们知道的有用信息。投入到调试中的努力是很好的花费。我经常在我的JPanels周围放置临时边界,以查看它们实际的大小,使用println和调试器来达到这个目的。 –

回答

3

有几个基本问​​题......

  1. JPanel默认情况下,使用FlowLayout
  2. FlowLayout使用组件的首选大小来确定如何布局组件是管理
  3. 您的组件不会覆盖getPreferredSize,这意味着它们将返回0x0
  4. A JPanel默认情况下不可重点关注,因此添加KeyListener到它,请求重点将做很少。您应该考虑使用Key Bindings而不是
  5. JLabel为绘图Icon提供支持。您可以在ImageIcon加包装一个Image使用与JLabel画图像更简单
  6. ImageIcon("resources/ball.png")表明,有问题的图像存储在磁盘上的文件,但路径表明,它们可以嵌入资源。 ImageIcon(String)预计基准是磁盘上的文件,这将是相对于程序

取决于你想要达到的目标的执行上下文,你不妨考虑编写自己的布局管理器,它可以用于控制子组件的位置或编写一个单独的“游戏表面”,您可以使用自定义绘画来绘制游戏状态

+0

哇感谢提示和不需要的代码指针。谢谢! – user3183865