java - 如何将2个JComponent添加到JPanel的同一位置

标签 java swing jpanel jcomponent

如何在完整 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)来代替,这很容易规避。

  • 您可以找到按键绑定(bind)教程 here
  • 以及我的答案中将其与动画一起使用的示例 here .

关于java - 如何将2个JComponent添加到JPanel的同一位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23585423/

相关文章:

java - 运行 Calendar Api 示例代码时出错

java - 为什么我的密码验证在 Java 中不起作用?

java - 如何在JPanel中设置背景图片

java - 如何实现布局?

java - 使用PaintComponent在Panel之外绘图

java - 接收双引号内的 JSON 响应

java - 如何解密@ConfigurationProperties bean 中使用的属性?

java - 使 Quartz 调度程序在没有 JDBC 的情况下持久化

java - 为什么程序没有终止?

java - 在背景图像上设置动画