繁体   English   中英

如何在同一位置向JPanel添加2个JComponent

[英]How to add 2 JComponent to JPanel at the same place

如何在整个JPanel上延伸的同一位置向JPanel添加2个JComponent? 我试图:

add(ship,null);

加(ground,null);

我在猜测您的用例,但是是否将包含JPanel的背景图像“磨碎”了? 如果是这样,则以某种方式添加它,以使其充满容器,当然可以使用BorderLayout通过BorderLayout.CENTER与容器一起填充。

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

与往常一样,细节中会发现魔鬼。 你先。


编辑
您发表评论:

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

我假设您在绘制背景图像的Stage对象中有一个paintComponent(Graphics g)重写方法。

基于此假设,我更改了先前的建议,因为我认为地面和舰船均不应扩展JPanel,因为您实际上不需要他们这样做。 您已经拥有一个JPanel,可以在其上进行绘画和游戏交互,那么当它们只会使事情变得混乱时,为什么还要创建更多呢? 我看到的唯一例外是地面或船舶是否需要容纳其他组件,如果是,则可以,它们应该扩展JPanel。

考虑:

  • 对于这两个物体(无论是地面还是船只)而言,重要的是它们的位置图像
  • 给予地面并运送带有getter和setter的可保存其图像的BufferedImage字段。
  • 给它们x和y int位置字段以及宽度和高度,以及可用于测试碰撞并可用于移动其各自的sprite(图像)的吸气剂和吸气剂。
  • 给他们一个draw(Graphics g)方法,该方法在调用并传递有效的Graphics实例时在x和y位置绘制各自的图像。
  • 让Stage拥有每个地面和每个船只的实例,并让Stage的paintComponent(Graphics g)方法通过调用它们各自的draw方法来绘制这两个实例。

编辑2
您现在问:

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

我建议您不要使用KeyListener。

KeyListener是一个低级构造,通常,您应该首选使用诸如Key Bindings之类的高级构造,因为它们更安全,更易于使用,而不会引起副作用或出现问题。 例如,如果使用KeyListener,很容易遇到焦点问题,因为它仅在侦听的组件具有焦点时才起作用。 如果您改用键绑定,则很容易避免。

  • 您可以在此处找到“键绑定”教程
  • 并与动画在我的答案使用它的一个例子在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM