2012-02-07 39 views
1

所以我使用GUI製作這個程序,我沒有太多的Swing/SWT工作,但有點知道發生了什麼。Java在事件中添加圖像

無論如何,我添加一個ActionListener的按鈕,這樣,當我點擊按鈕將添加到contentPane的圖像,但它不工作,除非我把它作爲一個JComponent(如下圖所示),並加我其他的東西(按鈕,JLabel等)後來...並將此JComponent設置爲內容視圖(這沒有任何意義)....我也試着擴展JPanel並清除原始內容並將它們重新添加到新的JPanel。問題是,當我這樣做的時候,它會以一種奇怪的方式爲我的JLabel重新創建文本,並且我只是知道應該有一種更簡單,更高效的方式。

class ShowImage extends JComponent{ 

    public ShowImage(){ 
     super(); 
     monkey = Toolkit.getDefaultToolkit().getImage(("D:/monkey.png")); 

    } 
public void paintComponent(Graphics g){ 
    g.drawImage(monkey, 20, 100, null); 
    repaint(); 
} 
} 

回答

4
  1. 不要調用repaint內部paintComponent
  2. 調用super.paintComponent然後繪製圖像

此外,根據不同的佈局管理器,這個組件將具有(0, 0)一個優選的大小,和因此將不可見。

欲瞭解更多信息,請參閱2D Graphics

編輯 - 注意動態地添加組件將迫使你重新驗證容器,併發出重繪請求,以便佈局管理器將重新佈局其成分,並移除任何視覺假象。另外,有關圖像的更多信息,請參見Working with Images

無論如何,最簡單的方法可能是將圖像設置爲JLabel實例的圖標並將其添加到容器。這裏真的不需要重新發明輪子。

+0

謝謝,我做了ImageIcon並將它用作JLabel。 – snotyak 2012-02-07 22:49:18

2
g.drawImage(monkey, 20, 100, this); 

..很可能已經修復了原代碼中的問題。這是一個組合問題:

  • 以異步方式加載圖像。 (Toolkit.getImage()而不是ImageIO.read()。)
  • 將它繪製成'blinkered'ImageObserverJComponent執行ImageObserver。一旦圖像被完全加載(以及之前的幾個點),觀察者將被通知,觸發repaint()