2017-01-08 112 views
0

我是相當新的Java和我想創建我自己的拼字遊戲。我創建了自己的類Board和Tile兩個JPanel。而在我局IM繪圖瓷磚:Java Swing重繪(),revalidate()問題後,添加Jpanel Jpanel

Tile tile = new Tile(currentlyChosenLetter, jump); 
board.add(tile); 
tile.setBounds(x * jump + 1, y * jump + 1, jump - 2, jump - 2); 

時,即時通訊做這樣的一切似乎都工作正常:加入後

Without repaint

但:

board.revalidate(); 
board.repaint(); 

磚是錯位的,我在移除瓷磚的情況下需要重新繪製。

WithRepaint

x和y IM從我的鼠標位置獲得:

int jump = board.getHeight()/15; 
int x = (e.getX()/jump); 
int y = (e.getY()/jump); 

其中E是的MouseEvent。

+3

1)*「..有2個問題」*然後開始兩個問題線程。 SO是問答網站,而不是服務檯。 2)發佈[mcve](對於每個問題線程,只有與該問題相關的代碼)。 3)不要忘了問一個明確的問題 - ** Q **&A網站。 –

回答

1
board.revalidate(); 
board.repaint(); 

revalidate()語句調用佈局管理器,以便根據佈局管理器的規則爲子組件提供大小和位置。 JPanel的默認佈局管理器是FlowLayout,因此這些組件顯示在一行上。

所以不要使用setBounds(...)。而應使用合適的佈局管理器,如GridLayout,並將組件添加到網格的每個平方。

我會建議你可能想每個網格JLabel。然後,您可以將每個標籤添加Icon,併爲給定的方塊添加默認圖標。然後,當您添加一封信時,您將圖標替換爲文字。

+0

this.setLayout(null);成功了! –

+1

@MaciekTrystuła,你似乎錯過了整個答案的重點。 Swing旨在用於佈局管理器,而不是空佈局。沒有必要使用空佈局。這是使用GridLayout的完美場景。它爲您完成所有佈局管理代碼。不要重新發明輪子! – camickr