如何在完整的JPanel上拉伸的同一个地方将2个JComponent添加到JPanel?我试着:
加(船,NULL);
加(接地,NULL);
答案 0 :(得分:3)
我猜测你的用例,但是" ground"包含JPanel的背景图片?如果是这样,那么以这样的方式添加它以便它填充容器,当然可能通过BorderLayout.CENTER和容器使用BorderLayout。
这艘船,我猜是一个在背景上绘制的精灵。如果是这样,请考虑让它不是JPanel,而是一个逻辑对象,它包含一个可以在地面的paintComponent方法中绘制的图像Sprite。
一如既往,魔鬼将在细节中找到。你先。
修改强>
您在评论中说明:
舞台是我的背景,它扩展了JPanel。 Ship是一个玩家元素(JComponent)。地面(JComponent)是玩家无法触及的东西。我想让这两个元素(地面和船舶)像绘制图像的图层一样。我需要有一个点参考来检查碰撞。
我假设您在舞台对象中有一个paintComponent(Graphics g)
覆盖方法,您可以在其中绘制背景图像。
基于这个假设,我改变了我之前的建议,因为我认为既不是地面也不是船只应该延伸JPanel,因为你并不真的需要他们这样做。你已经拥有了一个JPanel,你可以在其上进行绘图和游戏交互,那么为什么在它们只是混乱的时候创造更多呢?我看到的唯一例外是地面或船只需要保留其他组件,如果是,那么是的,它们应该扩展JPanel。
考虑一下:
draw(Graphics g)
方法,在调用并传递有效的图形实例时,在x和y位置绘制各自的图像。paintComponent(Graphics g)
方法通过调用各自的绘制方法来绘制两个实例。 编辑2
你现在问:
还有一个问题:我什么时候应该使用keyListener?
我建议你不使用KeyListener。
KeyListener是一个低级构造,一般来说,您应该更喜欢使用更高级别的构造,例如Key Bindings,因为它们更安全,更容易使用而不会产生副作用或出现问题。例如,如果使用KeyListener,则很容易遇到焦点问题,因为只有在侦听的组件具有焦点时它才有效。如果您使用键绑定,则很容易避免这种情况。