2013-07-17 88 views
1

我試圖覆蓋內部類JPanel中的方法paintComponent並繪製一些圖片。但如果我在構造函數中加載圖像,paintComponent方法不會調用。如果在主類中加載圖像,everythig很好。它是什麼?下面的代碼,這一點兒也不工作內部類奇怪的事情JPanel

import java.awt.Graphics; 
import java.awt.Image; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main { 
JFrame window; 
//Image image=new ImageIcon("D://domik.png").getImage(); 

class JPanelExt extends JPanel { 
    Image image; 

    public JPanelExt(){    
    image=new ImageIcon("D://domik.png").getImage(); 
    System.out.println("constructor");   
    } 

    @Override 
    public void paintComponent(Graphics g) {    
     super.paintComponent(g); 
     System.out.println("paint"); 
     g.drawImage(image, 0, 0, this); 
     g.drawRect(0, 400, 100, 100);  
    } 
}  

public Main(){ 

    window=new JFrame("Flowers"); 
    window.setSize(430, 480); 
    window.setVisible(true); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
    JPanelExt flower1 =new JPanelExt(); 
    flower1.setBounds(100, 100, 200, 200); 
    flower1.setToolTipText("House");     
    window.setLayout(null);    
    window.add(flower1);     
} 
public static void main(String[] args) { 

    Main main=new Main();  
} 
} 

而且系統輸出只寫「構造」

但如果我更改代碼這樣

public class Main { 
JFrame window; 
Image image=new ImageIcon("D://domik.png").getImage(); 

class JPanelExt extends JPanel { 
    //Image image; 

    public JPanelExt(){ 

    //image=new ImageIcon("D://domik.png").getImage(); 
    System.out.println("constructor"); 
      } 

    @Override 
    public void paintComponent(Graphics g) { 

     super.paintComponent(g); 
     System.out.println("paint"); 
     g.drawImage(image, 0, 0, this); 
     g.drawRect(0, 400, 100, 100); 

    } 

而且系統輸出寫道:「構造」,「油漆「

我不明白這一點))

+0

最後通過調用'setVisible'開始,並使用合適的佈局管理器 – MadProgrammer

+1

您還應該查看[Initial Threads](http://docs.oracle.com/javase/tutorial/uiswing/concurrency) /initial.html) – MadProgrammer

+0

此外,不要提供'絕對路徑',請參考此[答案](http://stackoverflow.com/a/11372350/1057230),爲應用程序添加圖像。 –

回答

3

貴‘的問題’是的順序在Main構造函數中的語句。

首先你正在構造一個新的框架。其次,你將它設置爲可見。此時它已被繪製,並且還調用其關聯面板上的繪畫方法。同樣在這一點上,沒有關聯的面板。第三,你構造一個新的JPanelExt並將其添加到框架中。這不會導致畫面被重新粉刷。

將呼叫

window.setVisible(true); 

在施工過程結束。然後你會看到你的形象。

+0

[併發中的擺動](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/),也是小時的需要,它也需要被賦予權重,即將一切都放在主方法內這個EventQueue.invokeLater(新的Runnable(){公共無效的運行(){/ *這裏去的主要內容* /}});',以及目前的信息,+1 –

+0

非常感謝!但爲什麼第二個變體的作品和調用paintComponent? – user2588825

+0

@ user2588825:因爲你的'window'已經可見了,所以在你添加'flower1'之前,因此'repaint()'調用只會發生,恕我直言,當你最小化你的窗口,或者拖動到' inc/dec'它的大小。這就是爲什麼它被認爲是一種良好的做法,首先將所有組件添加到父容器中,然後使其可見,而不是在此之前:-) –