2015-09-04 157 views
1

我的問題很容易解釋:我想要一個/一些JPanels,添加到JFrame中,用圖像繪製自己。可悲的是,最後一件事情是行不通的。對於信息:圖像路徑是正確的,並且JPanel大小與圖像大小相同。 THX求助:PJPanel paintComponent(...)does not work

package frames; 

import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Image; 
import javax.swing.ImageIcon; 
import javax.swing.JPanel; 
import world.Terrain; 

public class PanelTerrain extends JPanel { 
private Image img; 
private int x; 
private int y; 
private Image imga; 

    public PanelTerrain(Terrain terra, int x, int y) { 
     imga = new ImageIcon(terra.getPath()).getImage(); 
     this.x = x; 
     this.y = y; 
     this.setBounds(x, y, 8, 8); 
     //this.setBackground(terra.getColor()); 
    } 

    public void changeTerrain(Terrain t) 
    { 
     this.setVisible(false); 
     this.setBackground(t.getColor()); 
     this.setVisible(true); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(imga, x, y, this); 
    }     
} 
+1

你能看到jframe中的jpanel嗎?什麼是x,y值?如果你的面板和圖像大小相同,那麼x,y應該是0 –

+1

正如@FastSnail所述:你如何使用這個類?你如何測試圖像實際上是正確讀取的?您是否嘗試將圖像顯示爲JOptionPane中顯示的ImageIcon?如果是這樣,它工作嗎?考慮在JPanel周圍放置一個臨時邊界,以便清楚地看到它的實際大小。請發佈[mcve]。 –

+0

像仍然在代碼中呈現,我使用顏色測試面板,所以面板的作品。 :P 我使用它們: yArray [i] = new PanelTerrain(new Grass(),150 +(i * 8),50 + 8 * ycord); 面板應該出現的位置的x/y re。所以,用顏色進行測試,一切都像它應該的樣子。通過一個簡單的system.out.print()測試圖像(路徑)。但thx的提示,將嘗試一個JOptionPane() –

回答

5

我的第一個猜測是,你正在傳遞g.drawImage錯誤xy.xy是左上角的座標,圖像的體積不大,所以通常它們都是直接設置爲0(也就是說,g.draWimage(imga, x, y, this)

+0

好的答案。 1+ –

+0

thx很多,我現在不知道我是如何錯過了xD我試圖解決這個問題2天現在wile我有類似的東西在添加圖層面板whcih工作正常。但我真的忘了(不要問我爲什麼),圖像的座標是基於面板本身,而不是在框架xD,所以我得到了一個8乘8的面板,但一個圖像從右下角開始( (x,y,8,8);和g.drawImage(imga,0,0,this);它的工作方式應該如何工作) –

+2

@SimonMaas請考慮[接受](http://meta.stackexchange.com/a/5235)幫助你的答案最多。 –

2

一個很大的問題是你可能會濫用邊界和x和y,你在JPanel上調用setBounds(要避免),然後繪製圖像在某些x和y中,極有可能超出了JPanel的有限大小,不要這樣做秒。如需更完整的幫助,請創建併發布您的Minimal, Complete, and Verifiable example

這是我認爲你應該做的,而不是 - 假設你想圖像的網格,有人說地球,一些水,一些草,...的

  • 創建基本圖像ImageIcons ,一個圖標爲草,一個爲水,等等......
  • 創建一個使用GridLayout的JPanel,並用JLabels的網格填充它。
  • 將這些相同的JLabel放入JLabel的二維數組中。
  • 通過在JLabel上調用setIcon(newIcon)來在需要更改圖像的位置和時間交換標籤圖標。

例如,請參閱this answer of mine to a similar question以及其他同一問題的答案。