2015-12-11 52 views
0

我是編碼新手,並且遇到了使用paintComponent()顯示JPEG的問題。方法到java中的JFrame。我的代碼如下所示:在Java中使用paintComponent()方法顯示JPEG圖像

import java.awt.*; 
import javax.swing.*; 

class SimpleGuiMe { 
    MyDrawPanel imageex; 

    public static void main (String [] args){ 
     SimpleGuiMe gui = new SimpleGuiMe(); 
     gui.go(); 
    } 

    public void go() { 
     JFrame frame = new JFrame(); 
     imageex = new MyDrawPanel(); 

     frame.getContentPane().add(imageex); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 

    class MyDrawPanel extends JPanel { 

     public void paintComponent(Graphics g) { 
      Image image = new ImageIcon("WOW(1).jpg").getImage(); 
      g.drawImage(image,3,4,this); 
     } 
    } 
} 

我不知道我是否需要保存,我想爲了使用它在某個目錄顯示JPEG文件。

此外,我正在使用一個有點過時的教科書來獲取此處顯示的代碼。這是後Java 5.0,但只發佈於2005年。

任何幫助將不勝感激!

+0

可能的重複http://stackoverflow.com/questions/1242581/display-a-jpg-image-on-a-jpanel –

+0

它不是該帖子的重複,因爲它與圖像的位置有關。 – 11thdimension

+0

1)應用程序的資源(如圖像)將被部署的時間內成爲嵌入的資源,所以它是明智的,開始訪問他們,如果他們成功了,現在。 [tag:embedded-resource]必須通過URL而不是文件訪問。請參閱[信息。頁面爲嵌入式資源](http://stackoverflow.com/tags/embedded-resource/info)如何形成的URL。 2)不要嘗試使用繪畫方法加載圖像!他們應該在啓動時加載一次,並且是班級的屬性。 3)覆蓋繪畫方法時,首先調用super方法。 –

回答

0

你的面板類應該是類似下面

class MyDrawPanel extends JPanel { 
    private Image image; 
    public MyDrawPanel() { 
     image = new ImageIcon("C:/..path to file../marilyn monroe.jpg").getImage(); 
    } 
    public void paintComponent(Graphics g) { 

     g.drawImage(image,3,4,this); 
    } 
} 

ImageIcon的內部使用的FileInputStream從Sun的AWT API,它可以採取絕對或相對路徑的文件。如果你使用絕對路徑,那麼不用擔心,它每次都會工作而不會失敗。

如果你想使用相對路徑,那麼你必須找出哪個目錄是調用你的代碼的java進程的當前目錄。

假設我們調用下面的命令

C:/users/meuser>java SimpleGuiMe 

的java程序。然後當前目錄將是C:/users/meuser

如果你把圖像中C:/users/meuser或在此目錄中一個子目錄,那麼這將是訪問通過下面的相對路徑。

//directly inside C:/users/meuser 
image = new ImageIcon("marilyn monroe.jpg").getImage(); 

//in a sub directory like Downloads 
image = new ImageIcon("Downloads/marilyn monroe.jpg").getImage(); 

而不是使用的ImageIcon可以使用使用javax.imageio.ImageIO讀取圖像像下面的。 ImageIO的和的ImageIcon之間

image = ImageIO.read(new File("path to file/filename.jpg")); 

區別在於ImageIcon的具有構造爲支撐圖像位置URL參數,而ImageIO的是閱讀從任一文件或InputStream的圖像。

在這種情況下,相對和絕對路徑概念也保持不變。

Note:每當UI被更新時調用paintComponent方法,如調整窗口大小或繪製/重繪任何新元素。圖像閱讀應該在這個方法之外完成,因爲它可能需要一些時間來閱讀,你不希望paintComponent()方法阻塞UI直到圖像被讀取。還需要只讀一次。

+0

這是一個非常好的徹底答案。謝謝!代碼最終爲我工作。 –

+0

不客氣! – 11thdimension