2016-09-17 5 views
0

Ich habe ein paar Probleme bekommen ein Bild in Java gezeichnet. Es gibt keine Konsolenfehler und es druckt 'Zeichnung'. Ich glaube, ich lade das Bild falsch, aber ich kann den richtigen Weg nicht finden. Wenn mir jemand den richtigen Weg sagen könnte, wäre das toll.Zeichnung Bild in Jframe Spiel

 package platformer; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.util.List; 
import java.util.ArrayList; 
import javax.swing.Timer; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 
import java.awt.Image; 

public class test2 extends JPanel implements KeyListener, ActionListener { 

    int Width = 1000; 
    int Height = 600; 
    private static Image offScreenBuffer;// needed for double buffering graphics 
    private Graphics offScreenGraphics;// needed for double buffering graphics 
    private BufferedImage[] img = new BufferedImage[1]; 

    public test2() { 

    } 

    public void paint(Graphics g) { 

     super.paint(g); 
       g.drawImage(img[0],0,0,null); 
    } 

    public void timer1() { 
     int delay = 30; // milliseconds 
     new Timer(delay, this).start(); 
     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void actionPerformed(ActionEvent evt) { 

    } 

    public static void main(String args[]) throws InterruptedException, Exception { 

     test2 test2 = new test2(); 
     JFrame frame = new JFrame("platformer"); 
     frame.setSize(test2.Width, test2.Height); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setBackground(Color.green); 
     frame.add(test2); 
     frame.setResizable(false); 
     frame.addKeyListener(test2); 
     test2.init(); 
     test2.timer1(); 
     // What to do after the program starts 
     while (true) { 
      test2.repaint(); 

     } 
    } 

    public void init() { 


     try { 
      URL url = new URL("platform.png"); 
      img[0] = ImageIO.read(url); 
     } catch (IOException e) { 
     } 


    } 

    public void keyTyped(KeyEvent e) { 
    } 
    public void keyPressed(KeyEvent e) { 
    } 
    public void keyReleased(KeyEvent e) { 
    } 



} 
+0

Dies beantwortet Ihre Frage nicht, aber da Sie nur ein Bild haben, brauchen Sie kein Array. Mach einfach 'private Image img;'. –

+0

Ich schlage auch vor, Namen mit Zahlen zu beenden. Klassennamen sollten aussagekräftiger sein. Wenn Sie Variablennamen mit Zahlen beenden, benötigen Sie wirklich eine 'List' oder ein' Array. –

+0

Der Code, den Sie hier gepostet haben, wird durch all die zusätzlichen Dinge kompliziert, die in Ihrem Spiel involviert sind. Ich schlage vor, eine andere Klasse als Beispiel zu erstellen, die nur ein Bild lädt und es anzeigt. Wenn Sie weiterhin Probleme haben, bearbeiten Sie diese Frage mit Ihrer vereinfachten Version. –

Antwort

0

Swing hat eine Endlosschleife, die die Ereignisbehandlung für Sie übernimmt. Sie brauchen die while(true) Schleife nicht. Sie sollten frame.setVisible(true) aufrufen, nachdem Ihre gesamte Benutzeroberfläche konfiguriert wurde. Ich meine, dass es das letzte Ding in main() sein sollte. Außerdem sollten Sie dies auf dem UI-Thread tun mit

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     frame.setVisible(true); 
    } 
}); 

So main() wie

public static void main(String args[]) throws InterruptedException, Exception { 

     test2 test2 = new test2(); 
     JFrame frame = new JFrame("platformer"); 
     frame.setSize(test2.Width, test2.Height); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setBackground(Color.green); 
     frame.add(test2); 
     frame.setResizable(false); 
     frame.addKeyListener(test2); 
     test2.init(); 
     test2.timer1(); 
     SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     frame.setVisible(true); 
    } 
}); 
    } 

jedoch aussehen sollte, das Hauptproblem ist die try ... catch in init(), die ignoriert Ausnahmen. Sie sollten einen Haken niemals leer lassen. Zumindest sollten Sie einen Stacktrace ausdrucken. Noch besser wäre es, wirft die entsprechenden Ausnahmen von den Methoden hinzufügen Klausel wie folgt aus:

public void init() throws IOException { 
      URL url = new URL("platform.png"); 
      img[0] = ImageIO.read(url); 
    } 

Hinweis, wenn ein Problem auftritt, wissen Sie es sofort.

+0

Ich bekomme nicht, wie man das Bild zeigt, ich kann Rechtecke gut zeichnen, aber das Bild wird nicht funktionieren. – MickDom

+0

@MickDom Ich empfehle, das ganze 'if (level == 1)' zu entfernen und es durch ein einfaches 'g.drawImage()' zuerst zu ersetzen. Wenn du das machst, was passiert? –

+0

@MickDom Auch meine Entschuldigung für den Fehler in meinem Code-Snippet hier. Ich habe es repariert. –