2017-01-22 60 views
-1

我是新來的圖形在Java中,並一直試圖讓它釘牢,但我一直在這個問題卡在最後兩個星期。緩存的圖像正在讀取,但沒有出現

有兩個類,一個讀取文件(我認爲工作正常)和一個顯示它們。 (我想這就是問題的代表)

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import javax.swing.JFrame; 

public class jpaneTesting extends JFrame implements Runnable 
{ 

    public jpaneTesting(int x, int y) 
    { 
     super("testing"); 
     this.setBounds(0, 0, x, y); 
     this.setVisible(true); 
    } 

    @Override 
    public void paint(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 
     loader loader = new loader(); 
     BufferedImage character = loader.load("src\\resources\\hey.png"); //accesses hey.png 
     g2.drawImage(character,null,5,5); 
    } 

    @Override 
    public void run() 
    { 
     repaint(); 
    } 

    public static void main (String args[]) 
    { 
     Thread thread = new Thread (new jpaneTesting(500,500)); 
     thread.start(); //runs the thread that was sent that argument 
    } 
} 


import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

public class loader { 

    public BufferedImage load(String path){ 
     try { 
      BufferedImage img = ImageIO.read(new File(path)); 
      return img; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     System.out.println("oh no!"); //testing if image actually got there for myself 
     return null; 
    } 

} 
+0

請參閱編輯回答。 –

回答

2

這麼多的問題在這裏:

  • 你試圖直接在JFrame的內畫,你應該避免做的JFrame的油漆是負責如此之多,並且無需法院麻煩就可以凌駕它。
  • 而是做的教程指出:平局在JPanel的paintComponent的方法裏面,與地方的JPanel在你的JFrame。
  • 也可以像教程中指出的那樣:在覆蓋中調用超級繪畫方法。
  • 您正在閱讀繪畫方法中的圖像,也是一件不好的事情,一次不必要地多次讀入圖像,並不必要地減慢繪畫速度。
  • 閱讀中的圖像一次,如果可能的話在顯示GUI之前放入一個字段。然後在檢查null之後將其繪製在paintComponent方法中。
  • 您的g.drawImage(...)方法不正確,在錯誤的地方使用null。避免使用null,而是將this放入最後一個參數中。
  • 您使用線程是可疑的。至少將您的GUI代碼排列在Swing事件線程上。
  • 再一次,我不能重複:閱讀教程,因爲在陽光下沒有新東西。向專家學習。

例如:

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class ShowingImage extends JPanel { 
    private BufferedImage myImage; // variable to hold reference to image 

    public ShowingImage(BufferedImage img) { 
     this.myImage = img; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     // first call super method to do "house-keeping" drawing 
     super.paintComponent(g); 
     if (myImage != null) { 
      // if the image isn't null, draw it 
      g.drawImage(myImage, 0, 0, this); 
     } 
    } 

    // size our GUI based on the image size 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet() || myImage == null) { 
      return super.getPreferredSize(); 
     } 
     int w = myImage.getWidth(); 
     int h = myImage.getHeight(); 
     return new Dimension(w, h); 
    } 


    private static void createAndShowGui(BufferedImage img) { 
     ShowingImage mainPanel = new ShowingImage(img); 

     JFrame frame = new JFrame("ShowingImage"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     // the image path below must contain a path to image file relative to the class files location 
     String imagePath = ""; // TODO: fix this with real path! 

     URL imageUrl = ShowingImage.class.getResource(imagePath); 
     try { 
      final BufferedImage image = ImageIO.read(imageUrl); 

      // start GUI on the Swing event thread 
      SwingUtilities.invokeLater(() -> createAndShowGui(image)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

請檢查在代碼中的註釋。上面的代碼不完整,直到您更改行String imagePath = "";,以便它包含指向圖像路徑的字符串(相對於您的類文件的路徑)爲止不起作用。您可能希望從您的某個類包目錄中創建一個子目錄,並可能將其稱爲圖像,並將該應用程序的圖像放置在那裏。