簡體   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