2017-01-22 4 views
-1

Ich bin neu in Java und habe versucht, es zu nageln, aber ich habe dieses Problem in den letzten zwei Wochen festgefahren.Gepuffertes Bild wird gelesen, aber nicht angezeigt

Es gibt zwei Klassen, eine Klasse, die Dateien liest (was meiner Meinung nach richtig funktioniert) und eine, die sie anzeigt. (Ich denke, das ist, wo das Problem steht)

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

Bitte beachten Sie bearbeiten zu beantworten. –

Antwort

2

So viele Probleme hier:

  • Sie versuchen, etwas in einem JFrame, direkt zeichnen Sie vermeiden sollten tun, als die JFrame Farbe ist verantwortlich für so viel, und überschreibe es, ohne Gerichtsprobleme zu brauchen.
  • Stattdessen tun, wie die Tutorials zeigen: Zeichnen Sie in der PaintComponent-Methode eines JPanel, und legen Sie das JPanel in Ihrem JFrame.
  • Tun Sie auch, wie die Tutorials darauf hinweisen: Rufen Sie die Super-Malmethode innerhalb Ihrer Überschreibung auf.
  • Sie lesen in einem Bild aus einer Malmethode, wieder eine schlechte Sache zu tun, eine, die unnötigerweise in das Bild mehrmals liest, und unnötigerweise verlangsamt die Malerei.
  • Lesen Sie das Bild in einmal, vor der Anzeige der GUI wenn möglich, und in ein Feld platzieren. Zeichnen Sie es dann in Ihrer paintComponent-Methode nach der Überprüfung auf Null.
  • Ihre g.drawImage(...) Methode ist falsch mit null an der falschen Stelle. Vermeiden Sie die Verwendung von null und setzen Sie stattdessen this in den letzten Parameter.
  • Ihre Verwendung von Threading ist verdächtig. Stellen Sie zumindest Ihren GUI-Code für den Swing-Ereignisthread in eine Warteschlange.
  • Noch einmal, ich kann nicht genug wiederholen: Lesen Sie die Tutorials zu diesem Thema, da es nichts Neues unter der Sonne gibt. Lernen Sie von den Experten.

Zum Beispiel:

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(); 
     } 
    } 
} 

Bitte überprüfen Sie die Kommentare im Code aus. Der obige Code ist nicht vollständig und wird nicht funktionieren, bis Sie die Zeile String imagePath = ""; so ändern, dass es einen String enthält, der auf einen Imagepfad relativ zu dem Pfad zu Ihren Klassendateien verweist. Sie werden wahrscheinlich ein Unterverzeichnis aus einem Ihrer Klassenpaketverzeichnisse erstellen und es vielleicht als Bilder bezeichnen und die Bilder der Anwendung dort ablegen.

Verwandte Themen