如何在完整 JPanel 上拉伸(stretch)的同一位置将 2 个 JComponent 添加到 JPanel?我尝试:
add(ship,null);
add(ground,null);
最佳答案
我猜测您的用例,但是“ground”是包含 JPanel 的背景图像吗?如果是这样,则以这样的方式添加它,以便它填充容器,当然可以通过 BorderLayout.CENTER 与使用 BorderLayout 的容器。
我猜这艘船是一个在背景上绘制的 Sprite 。如果是这样,请考虑让它不是 JPanel,而是一个逻辑对象,其中包含可以在地面的 PaintComponent 方法中绘制的图像 Sprite。
一如既往,细节决定成败。你先。
<小时/>编辑
您在评论中指出:
Stage is my background and it extends JPanel. Ship is a player element (JComponent). Ground (JComponent) is something which player can't touch. I wanted to have this two elements (ground and ship) like layers where the image is drawn. I need to have one point reference to check collisions.
我假设您在绘制背景图像的 Stage 对象中有一个 paintComponent(Graphics g)
重写方法。
基于这个假设,我改变了我之前的建议,因为我认为地面和船舶都不应该扩展 JPanel,因为你并不真正需要它们这样做。您已经有了一个 JPanel,可以在上面进行绘图和游戏交互,那么为什么还要创建更多 JPanel,因为它们只会让事情变得困惑呢?我看到的唯一异常(exception)是地面或船舶是否需要容纳其他组件,如果是这样,那么是的,它们应该扩展 JPanel。
考虑:
- 对于这些物体(无论是地面物体还是船舶物体)来说,重要的是它们的位置和图像。
- 为地面和船舶提供一个可以保存其图像的 BufferedImage 字段,并带有 getter 和 setter。
- 为它们提供 x 和 y int 位置字段以及宽度和高度,以及可用于测试碰撞并可用于移动各自 Sprite (图像)的 getter 和 setter。
- 为它们提供一个
draw(Graphics g)
方法,该方法在调用并传递有效的 Graphics 实例时在 x 和 y 位置绘制各自的图像。 - 让 Stage 保存每个地面和船只的实例,并让 stage 的
paintComponent(Graphics g)
方法通过调用各自的绘制方法来绘制这两个实例。
编辑2
你现在问:
One more question: When should i have keyListener?
我建议您不要使用 KeyListener。
KeyListener 是一个低级构造,一般来说,您应该更喜欢使用更高级别的构造,例如键绑定(bind),因为它们更安全、更易于使用,不会造成副作用或出现问题。例如,如果使用 KeyListener,很容易遇到焦点问题,因为它仅在监听的组件具有焦点时才起作用。如果您使用键绑定(bind)来代替,这很容易规避。
关于java - 如何将2个JComponent添加到JPanel的同一位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23585423/