如何在同一个地方将2个JComponent添加到JPanel

时间:2014-05-10 19:33:13

标签: java swing jpanel jcomponent

如何在完整的JPanel上拉伸的同一个地方将2个JComponent添加到JPanel?我试着:

  

加(船,NULL);

     

加(接地,NULL);

1 个答案:

答案 0 :(得分:3)

我猜测你的用例,但是" ground"包含JPanel的背景图片?如果是这样,那么以这样的方式添加它以便它填充容器,当然可能通过BorderLayout.CENTER和容器使用BorderLayout。

这艘船,我猜是一个在背景上绘制的精灵。如果是这样,请考虑让它不是JPanel,而是一个逻辑对象,它包含一个可以在地面的paintComponent方法中绘制的图像Sprite。

一如既往,魔鬼将在细节中找到。你先。


修改
您在评论中说明:

  

舞台是我的背景,它扩展了JPanel。 Ship是一个玩家元素(JComponent)。地面(JComponent)是玩家无法触及的东西。我想让这两个元素(地面和船舶)像绘制图像的图层一样。我需要有一个点参考来检查碰撞。

我假设您在舞台对象中有一个paintComponent(Graphics g)覆盖方法,您可以在其中绘制背景图像。

基于这个假设,我改变了我之前的建议,因为我认为既不是地面也不是船只应该延伸JPanel,因为你并不真的需要他们这样做。你已经拥有了一个JPanel,你可以在其上进行绘图和游戏交互,那么为什么在它们只是混乱的时候创造更多呢?我看到的唯一例外是地面或船只需要保留其他组件,如果是,那么是的,它们应该扩展JPanel。

考虑一下:

  • 对于这两个对象(地面和船舶)而言,重要的是位置及其图像
  • 同时为地面和船舶提供一个可以保存图像的BufferedImage字段,包括getter和setter。
  • 为它们提供x和y int位置字段和宽度和高度,使用可用于测试碰撞的getter和setter,可用于移动它们各自的sprite(图像)。
  • 为他们提供draw(Graphics g)方法,在调用并传递有效的图形实例时,在x和y位置绘制各自的图像。
  • 让Stage持有每个地面和船只的实例,并让舞台的paintComponent(Graphics g)方法通过调用各自的绘制方法来绘制两个实例。

编辑2
你现在问:

  

还有一个问题:我什么时候应该使用keyListener?

我建议你使用KeyListener。

KeyListener是一个低级构造,一般来说,您应该更喜欢使用更高级别的构造,例如Key Bindings,因为它们更安全,更容易使用而不会产生副作用或出现问题。例如,如果使用KeyListener,则很容易遇到焦点问题,因为只有在侦听的组件具有焦点时它才有效。如果您使用键绑定,则很容易避免这种情况。

  • 您可以找到Key Bindings教程here
  • 以及在我的回答here中使用动画的示例。