2015-01-26 35 views
0

我是Java新手,目前我的水平是圍繞打印文本。儘管如此,我想從圖形內容開始,但很遺憾,我無法做到這一點。我不明白paintComponent如何在Java中工作

我開始使用JFrame,一切都很順利,但是當我必須打印圖像時,我遇到了問題。感謝YouTube,我可以將這段代碼複製到清晰顯示的位置(對我來說還不夠),如何在JFrame中打印圖像。

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

public class Main extends JPanel{ 

    public static void main(String[] args){ 

    JFrame j = new JFrame("Image"); 

    j.setSize(1080,720); 

    j.setVisible(true); 

    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    j.add(new Main()); 

    } 

    public void paintComponent(Graphics g){ 

    super.paintComponent(g); 

    ImageIcon i = new ImageIcon("C:\\Users\\Hello\\Pictures\\picture.jpg"); 

    i.paintIcon(this, g, 0, 0); 

    } 

} 

我真的不明白這一點。我在互聯網上尋找解釋,但沒有答案真的幫助我。我不明白的基本上是j.add(new Main())(我們鏈接相同的類?)和paintComponent(Graphics g) ...

+3

如果的Youtube海報有更多的影片,你會做得很好,以避免它們因爲他在代碼中的一些突出問題: 他的閱讀在paintComponent方法裏面的圖像文件,什麼是不必要的浪費(爲什麼要多次閱讀它?)以及一些可以減慢GUI圖形爬行的東西,從而不應該完成**。 2.他還創建了一個ImageIcon,其中只需要像BufferedImage這樣的圖像即可。 – 2015-01-26 18:43:34

+0

至於「paintComponent如何工作」,這是一個**非常廣泛的主題,可以在本網站的範圍內進行回答。最好爲你看看更好的教程,你可以在這裏找到基本信息:[課程:執行自定義繪畫](http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html),以及更高級的信息:[在AWT和Swing中繪畫](http://www.oracle.com/technetwork/java/painting-140037.html)。 – 2015-01-26 18:45:15

+0

至於'j.add(new Main())',你在這裏創建一個Main對象,其中**是一個JPanel,並將它添加到'j',一個'JFrame',頂層窗口,然後顯示。請注意,main方法有另一個錯誤 - 只有在添加了所有組件後,才應該在JFrame上調用'setVisible(true)'。否則有可能不顯示某些組件。 – 2015-01-26 19:53:26

回答

2

我不認爲我在一個假設的教學示例中見過這麼多的錯誤。

這是重寫的代碼。您必須將圖像放入與Java代碼相同的目錄才能讀取圖像。

package com.ggl.testing; 

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class DrawImage implements Runnable { 

    @Override 
    public void run() { 
     JFrame j = new JFrame("Image"); 
     j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     j.add(new ImagePanel(getImage())); 

     j.pack(); 
     j.setLocationByPlatform(true); 
     j.setVisible(true); 
    } 

    private Image getImage() { 
     try { 
      return ImageIO.read(getClass().getResourceAsStream(
        "StockMarket.png")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new DrawImage()); 
    } 

    public class ImagePanel extends JPanel { 

     private static final long serialVersionUID = -2668799915861031723L; 

     private Image image; 

     public ImagePanel(Image image) { 
      this.image = image; 
      this.setPreferredSize(new Dimension(image.getWidth(null), image 
        .getHeight(null))); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(image, 0, 0, null); 
     } 

    } 

} 

以下是從此代碼中取得的重要概念。

  1. 總是通過調用SwingUtilities invokeLater方法來啓動Java Swing應用程序。這會將Swing組件的創建和更新置於Event Dispatch thread (EDT)上。

  2. 正如其他人所提及的,在嘗試顯示它們之前先閱讀這些圖像。如果圖像丟失,此代碼將異常終止。當您將Java類與圖像一起打包到JAR文件中時,此代碼也可以工作。

  3. 您不設置任何尺寸。你讓JFrame和JPanels使用Swing layouts來計算它們自己的大小。在這個特定的例子中,JPanel佔用你讀取的圖像的大小,並且JFrame只是足夠大以容納圖像JPanel。

  4. 您使用Swing組件。當你想覆蓋類中的方法時,你只擴展一個Swing組件。在這個例子中,我們使用了JFrame並擴展了一個JPanel。

+0

爲什麼Java很複雜?我只是想在一個窗口上打印出一張圖像,我只需要這樣做。我是一名初學者,我覺得這種語言非常困難。 – Arnau 2015-02-01 15:08:04

+0

@Arnau:你說的對。 Java很難學,因爲你可以使用Java創建許多不同的應用程序。 Java Swing有規則,一旦你瞭解規則,你就可以自由地創造性。 – 2015-02-02 14:54:11

相關問題