2014-11-13 29 views
1

我正在研究一個項目,其中顯示一個正方形和一個圓。 圓圈自行移動,但用戶通過箭頭鍵移動方塊。每當圓形接觸廣場時,它就會反彈。將一個框架上的多個面板相互重疊

正方形和圓形是不同的類(2個不同的面板)。我想將這兩個添加到一個框架,一個在另一個之上,這樣兩個都可見。 有人可以告訴我該怎麼做嗎?

JFrame n = new JFrame(); 
n.setTitle("Background Color for JFrame"); 
n.setSize(1000,600); 
n.setLocationRelativeTo(null); 
n.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

n.setResizable(false); 

n.add(new Ball()); 
n.add(new Team()); 

n.setVisible(true); 
+0

這會是任何一種遊戲? – tobs

+0

是它的一個足球遊戲:) – user3512121

+0

然後使用一個單獨的JPane並使用Graphics2D繪製您的圓形組件到它可能是一個更好的主意。然後你的遊戲對象只需要子類'java.lang.Object'並且包含一個將圖形作爲參數的'draw()'方法。 – tobs

回答

0

默認情況下,層級中同一級別的用戶界面組件被假定爲不重疊。您可以明確地解決此問題,方法是使用setOpaque(false)將組件透明化,假設您只關注繪製組件所需的內容,例如在JPanel的情況下確保其背景沒有繪製。它仍然有點隨機(依賴於實現)在執行此操作時哪個組件優先於另一個組件。

有一個明確爲此設計的組件:JLayeredPane(https://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html),它管理可以放置組件的「圖層」,讓您可以完全控制哪個圖層覆蓋哪個圖層。

由於JComponent的完整特性不需要表示一個簡單的圖形元素,所以遊戲通常會自行實現這一點。在這種情況下,單個組件被用作「畫布」來將自定義對象繪製到使用paintComponent的覆蓋上(請參閱:https://docs.oracle.com/javase/tutorial/uiswing/painting/

0

如果你想在swing中這樣做,聽起來,我會真的推薦製作一個擴展JPanel的新類,並覆蓋它的paintComponent方法。在這種方法中,您可以使用參數中的圖形繪製到畫布。然後,您可以將此自定義面板而不是兩個單獨的組件添加到您的JFrame,並在其中處理渲染。這個渲染面板可以跟蹤所有需要渲染的對象,最好使用draw(Graphics g)方法實現一些接口(Drawable?)。通過這種方式,您可以讓需要渲染的類實現Drawable接口,然後將其作爲渲染面板中的列表,然後在paintComponent方法中迭代遍歷它們並調用Drawable上的Draw。