2017-05-28 5 views
2

Ich habe versucht, dies für immer herauszufinden, aber ich kann es nicht herausfinden.Wie zeige ich mehrere Bilder auf JPanel an?

Ich mag würde mehr als ein Bild auf dem Bildschirm in der gleichen JPanel angezeigt werden, aber aus irgendeinem Grunde, zeigt es nur das letzte Bild aus der Lackkomponente

Ich versuche, ein Obst Ninja-Stil Spiel zu machen und möchte die Früchte aus dem Rahmen zeichnen, bevor Animationen stattfinden.

Hat jemand eine Idee, wie dies zu tun? Jede Hilfe sehr geschätzt ...

import javax.swing.*;//imports JPanel class 
import java.awt.*;//imports the Graphics class 

public class FruitNinja extends JPanel { 

    private Image dojo; 
    private Image apple; 
    private Image orange; 
    private Image pineapple; 
    private Image strawberry; 
    private Image banana; 

    private Timer timer; 
    private int x, y; 

    public FruitNinja() { // a constructor to set up graphics windo 
     super(); 
     setBackground(Color.WHITE); 
     loadImage(); 
     x = 25; 
     y = 25; 


    } 



    private void loadImage() { 
     ImageIcon ii = new ImageIcon("Dojo.jpg"); 
     dojo = ii.getImage(); 

     ImageIcon oo = new ImageIcon("Orange.ico"); 
     orange = oo.getImage(); 

     ImageIcon ss = new ImageIcon("Strawberry.png"); 
     strawberry = ss.getImage(); 

     ImageIcon bb = new ImageIcon("Banana.png"); 
     banana = bb.getImage(); 

     ImageIcon pp = new ImageIcon("Pineapple.png"); 
     pineapple = pp.getImage(); 

     ImageIcon aa = new ImageIcon("Apple.png"); 
     apple = aa.getImage(); 


    } 

    public void paintComponent(Graphics g){ // draw graphics in the panel 

     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(dojo, 0,0, this); 
     //draws out dojo 


     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(apple, 0,0, this); 

     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(orange, 0,0, this); 

     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(pineapple, 0,0, this); 

     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(banana, 0,0, this); 

     super.paintComponent(g);// to make panel display correctly 
     g.drawImage(strawberry, 0,0, this); 

     //draws out the fruits somewhere 
    } 

    /* 
    @Override 
    public void actionPerformed(ActionEvent e) { 

     x += 5; 
     y += 5; 

     if (y > getHeight()) { 
     y = 25; 
     x = 25; 
     } 
     repaint(); 
    } 
*/ 

    public static void main(String[] args) { 

     FruitNinja panel = new FruitNinja(); // window for drawing 
     JFrame f = new JFrame(); // the program itself 
     f.setTitle("Fruit Ninja"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//when the X button is clicked, the program quits 
     f.setSize(1280,800);//size of the frame 
     Container pane = f.getContentPane();//pane refers to the interior of the JFrame 

     FruitNinja p1 = new FruitNinja(); 

     pane.add(p1);//add the FacePanel object to the interior of the frame 
     f.setVisible(true); 

    } 
} 

auch in keinem Zusammenhang mit dieser aktuellen Frage würde, da ich versuche, ein FruitNinja ähnliches Spiel zu machen, Wie mache ich es so, dass der Code registriert, dass meine Maus dort ist (also schneidet es die Frucht, wenn meine Maus über die Frucht schwebt)? ist es MausListenter?

+0

Die einfachste Lösung ist mit einem geeigneten Layout-Manager und 'JLabel's – MadProgrammer

+0

Ich würde vorschlagen, einen Blick auf [Malerei in AWT und Swing] mit (http://www.oracle.com/technetwork/java/ painting-140037.html) um zu verstehen, warum du das Problem hast, das du hast – MadProgrammer

+0

Fertig damit. – Martin

Antwort

3

Ich würde vorschlagen, einen Blick auf Painting in AWT and Swing mit zu verstehen, warum Sie das Problem sind, Sie

Eines der Arbeitsplätze haben, das paintComponent tut es den Graphics Kontext für die Malerei der Komponente bereitet, ist es normalerweise tut dies indem sie sie mit der Hintergrundfarbe der Komponente

So basiert auf dich Code füllen, das würden Sie braucht nur vorschlagen paintComponent einmal zu nennen, zu Beginn des Verfahrens

public void paintComponent(Graphics g){ // draw graphics in the panel 

    super.paintComponent(g);// to make panel display correctly 
    g.drawImage(dojo, 0,0, this); 
    //draws out dojo 
    g.drawImage(apple, 0,0, this); 
    g.drawImage(orange, 0,0, this); 
    g.drawImage(pineapple, 0,0, this); 
    g.drawImage(banana, 0,0, this); 
    g.drawImage(strawberry, 0,0, this); 
    //draws out the fruits somewhere 
} 

So, jetzt alle Bilder gemalt, auf der jeweils anderen

auch in keinem Zusammenhang mit dieser aktuellen Frage werden sollte, da ich ein FruitNinja Spiel zu machen bin versucht, wie kann ich es so den Coderegister machen dass meine Maus da ist (also schneidet sie die Frucht, wenn meine Maus über die Frucht schwebt)? ist es MausListenter?

Sie sind wahrscheinlich für eine MouseMotionListener suchen, haben einen Blick auf How to Write a Mouse Listener um weitere Informationen zu

+0

Okay, danke für die Hilfe! Ich schätze die Informationen, die Sie mir gegeben haben, sowie die zusätzlichen Informationen, die einem neuen Programmierer wie mir helfen. Nochmals vielen Dank für die schnelle Antwort. – Martin

1

Sie JPanel erweitert haben und in diesem JPanel haben Sie in der gleichen x und y gezogen, die 0 ist. Und auch in der überschriebenen paintComponent() Methode rufen Sie die Klassenmethode super Anzahl von Zeiten. Aus diesem Grund können Sie nur zuletzt gezeichnetes Bild sehen. diese

Wechsel:

super.paintComponent(g); 
    g.drawImage(apple, 0,0, this); 

    super.paintComponent(g); 
    g.drawImage(orange, 0,0, this); 

    super.paintComponent(g); 
    g.drawImage(pineapple, 0,0, this); 

    super.paintComponent(g); 
    g.drawImage(banana, 0,0, this); 

    super.paintComponent(g); 
    g.drawImage(strawberry, 0,0, this); 

An:

super.paintComponent(g); 

    g.drawImage(apple, 0,0, this); 
    g.drawImage(orange, 0,0, this); 
    g.drawImage(pineapple, 0,0, this); 
    g.drawImage(banana, 0,0, this); 
    g.drawImage(strawberry, 0,0, this); 

Noch können Sie keine anderen Bilder sehen, weil alle Bilder in der jeweils anderen sind. Um dies zu vermeiden kann man so etwas tun:

super.paintComponent(g); 

    g.drawImage(dojo, x,0, this); 
    g.drawImage(apple, x,100, this); 
    g.drawImage(orange, 300,100, this); 
    g.drawImage(pineapple, x,300, this); 
    g.drawImage(banana, 300,0, this); 
    g.drawImage(strawberry, 300,300, this); 

können Sie ändern x und y cordinate wie Sie wollen. Aber das ist immer noch verwirrend und nervig, es ist auch zeitaufwendig. Nun, es gibt einen besseren Weg, dies zu tun. Das ist Layout Manager.

Denken Sie an eine Möglichkeit, Layout Manager zu Ihrem Programm zu verwenden. Diese Verbindung kann Ihnen helfen:

Im letzten Teil Ihrer Frage erwähnen Sie

wie mache ich es so der Code registriert, dass meine Maus

Sie müssen es bekommen aktuelle Position des Zeigers (x und y).

ist es mausListenter?

Nein, es sei denn, Sie haben nicht viele Ereignisse. mouseListenter für Mausereignisse (drücken, freigeben, klicken, eingeben und beenden) für eine Komponente.

Was Sie brauchen, ist MouseMotionListener nach obiger Aussage. Es ist für Mausbewegungsereignisse auf einer Komponente.

UPDATE (nach dem Kommentar):

Ich bin nicht wirklich sicher, wie Sie ein Mouse verwenden? Ich bin in der Lage die Frucht/Bilder zu animieren, so dass es jetzt um meinen Rahmen fliegt. Wie mache ich Ich benutze den MouseMotionListener, um diese Frucht aus dem Rahmen einmal zu verschieben Ich schweben über es?

Diese aus dem Umfang der Frage ist, sondern als Hilfe,

Nun, dies haben Sie alle Bilder in JLabel hinzufügen s sonst kann man Zuhörer auf das Panel hinzuzufügen. Da es mehrere Bilder gibt, müssen Sie Etiketten erstellen. Um dies zu tun ich neue Methode erstellt haben, sollten Code wie folgt aussehen:

public void moveImage(ImageIcon icon){ 
    JLabel dojoLabel = new JLabel(); 
    dojoLabel.setIcon(icon); 
    this.add(dojoLabel); 

    dojoLabel.addMouseMotionListener(new MouseMotionAdapter() { 
     public void mouseMoved(MouseEvent evt){ 
      dojoLabel.setLocation(0,0); 
      repaint(); 
     } 
    }); 
} 

Jetzt in Ihrem loadImage() Aufruf dieser Methode Parsen ImageIcon. Es kann kein Image Typ zu einem JLabel hinzugefügt werden. Deshalb müssen Sie ImageIcon hinzufügen.

private void loadImage() { 
     ImageIcon ii = new ImageIcon("Dojo.jpg"); 
     dojo = ii.getImage(); 
     //..... 
     //move method here 
     moveImage(ii); 
} 
+1

Okay, danke für die ausführliche Antwort.Glücklicherweise konnte ich dieses Problem beheben, indem ich nur einmal super anrief und meine Früchte in verschiedenen Bereichen bewegte. Ich bin mir nicht sicher, wie Sie einen MouseMotionListener verwenden. Ich war in der Lage, die Früchte/Bilder so zu animieren, dass sie jetzt um meinen Rahmen fliegen. Wie verwende ich den MouseMotionListener, um diese Frucht aus dem Rahmen zu entfernen, sobald ich den Mauszeiger darüber bewege? Ich habe MouseMotion Listener online gesucht und es gibt ein Tutorial, aber ich bin mir immer noch nicht sicher. – Martin

+0

@Martin diese Frage kann helfen: https://stackoverflow.com/questions/17867537/java-drawimage-how-do-i-undraw-oder-delete-a-image – Blasanka

+0

Ja, ich bin mir nicht ganz sicher, wie benutze den MouseMotionListener ???? Denk daran, was du mit mir verlinkt hast, war etwas über das Löschen von Bildern. – Martin

Verwandte Themen