2016-04-14 13 views
0

Für ein Projekt, das ich mache, muss ich 2 Klassen erstellen, von denen eine ein JFrame erstellt und die andere das ein Bild enthält, das dem JFrame hinzugefügt werden muss.Hinzufügen von Bildern zu JFrame aus anderen Klassen

Meine JFrame Erstellen Klasse heißt Treiber und sieht wie folgt aus:

import javax.swing.JFrame; 
import javax.swing.JTextField; 
public class Driver { 
    private JFrame win; 
    private Animals animals = new Animals(); 
    private BirdButton nextBtn, enlargeBtn, shrinkBtn, moveToBtn; 
    private JTextField field; 

    public Driver() { 
     win = new JFrame("Angry Animal Name Game"); 
     win.setBounds(100, 100, 600, 600); 
     win.setLayout(null); 
     win.setVisible(true); 
     nextBtn = new BirdButton("NEXT", 10, 10, animals); 
     win.add(nextBtn, 0); 
     enlargeBtn = new BirdButton("ENLARGE", 10, 60, animals); 
     win.add(enlargeBtn, 0); 
     shrinkBtn = new BirdButton("SHRINK", 10, 110, animals); 
     win.add(shrinkBtn, 0); 
     field = new JTextField(); 
     field.setBounds(10, 250, 100, 20); 
     win.add(field, 0); 
     moveToBtn = new BirdButton("MOVETO", 10, 275, animals, field); 
     win.add(moveToBtn, 0); 
     win.add(animals, 0); 
     animals.recenter(); 
     win.repaint(); 
    } 
} 

Dann habe ich eine eigene Klasse Tiere, die ein Bild von einigen Vögeln enthält. Ich möchte, dass dieses Bild auf meinem JFrame angezeigt wird, aber mein Code scheint nicht so gut zu funktionieren. Tiere sieht wie folgt aus:

public class Animals extends Image { 
    public Circle selector; 
    public Image birds; 

    public Animals(){ 
     birds = new Image(225,200,150,200); 
     birds.setImage("AngryBirds.png"); 
     selector = new Circle(70,70,birds.getX(),birds.getY()); 
     selector.setThickness(5); 
     birds.add(selector,0); 
    } 

    public void recenter(){ 
     birds.setLocation((600-birds.getWidth()/2),(600-birds.getHeight()/2)); 
    } 
} 

Da Tiere erstreckt Bild bin ich in der Lage, die diesen Befehl verwenden Tiere das Bild selbst zu machen oder was ich tun? Ich sollte Treiber in keiner Weise modifizieren.

public class Animals extends Image { 
    public Circle selector; 

    public Animals(){ 
     new Image(225,200,150,200); 
     setImage("AngryBirds.png"); 
     selector = new Circle(70,70,this.getX(),this.getY()); 
     selector.setThickness(5); 
     this.add(selector,0); 
    } 

    public void recenter(){ 
     this.setLocation((600-this.getWidth()/2),(600-this.getHeight()/2)); 
    } 
} 
+1

Ihre neue Animals-Klasse erweitert Image noch. Sie haben nichts über diese Image-Klasse erwähnt - ist das Ihre Klasse? Ist es 'java.awt.Image'? –

+1

'win.setLayout (null);' 1) Java GUIs müssen auf verschiedenen Betriebssystemen, Bildschirmgrößen, Bildschirmauflösungen usw. mit verschiedenen PLAFs in verschiedenen Locales arbeiten. Als solche sind sie nicht für ein perfektes Pixel-Layout geeignet. Verwenden Sie stattdessen Layout-Manager oder [Kombinationen davon] (http://stackoverflow.com/a/5630271/418556) zusammen mit Layout-Auffüllung und Rahmen für [Leerraum] (http://stackoverflow.com/a/17874718/ 418556). 2) Um eine bessere Hilfe zu erhalten, sollten Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) veröffentlichen. –

+0

Sorry für die Verwirrung, Image ist eine Klasse, die der Professor uns gegeben hat. Ich schien die Probleme selbst erarbeitet zu haben, aber @HovercraftFullOfEels Ihre Ideen gaben mir den Anstoß.Danke –

Antwort

3

In erster Linie sicherstellen, dass Tiere nicht Bild erstreckt:

Dank

Nach einigen Antworten, die ich meine Tiere Code bearbeitet, dies zu sein. Animals ist kein Image in irgendeiner Form und sollte das nicht verlängern. Außerdem müssen Sie klären, welche Image-Klasse Sie verwenden. Eine Swing-Komponente erwartet die Verwendung von Images, die von java.awt.Image stammen, und wenn Sie Ihre eigene Klasse namens Image haben, und es so aussieht (z. B. birds = new Image(225,200,150,200);), benennen Sie sie sofort um, um Namenskonflikte zu vermeiden.

Jetzt, um den JFrame Bilder zu verwenden, müssen Sie Bilder erstellen, die es verwenden kann, in der Regel ein BufferedImage, normalerweise erhalten ImageIO.read(...) - ich sehe keine BufferedImage in Ihrem Code verwenden, also wenn ich Sie wäre, würde ich beginnen Dort.

Es sieht auch so aus, als ob Ihre Animals-Klasse keine Bilder eines beliebigen Typs erweitern sollte, sondern stattdessen eine Art von Swing-Komponente erweitern sollte, da Sie sie scheinbar zu Ihrem JFrame hinzufügen.

Weitere Themen:

  • Ihre Treiber-Klasse Code verwendet null Layout. Während Null-Layouts und setBounds() Swing-Neulinge wie die einfachste und beste Möglichkeit erscheinen, komplexe GUI's zu erstellen, erzeugen Sie mit der Swing GUI'S die ernsteren Schwierigkeiten, denen Sie begegnen werden, wenn Sie sie benutzen. Sie werden die Größe Ihrer Komponenten nicht ändern, wenn die GUI die Größe ändert, sie sind eine royale Hexe, die verbessert oder beibehalten wird, sie scheitern komplett, wenn sie in Scrollpanels platziert werden. Sie sehen auf allen Plattformen oder Bildschirmauflösungen, die sich vom Original unterscheiden, grässlich aus . Hat dein Lehrer diese Klasse erstellt? Wenn ja, muss ich mich fragen, ob sie wissen, was sie tun.
+0

Zunächst einmal, vielen Dank für Ihre Antwort, es sind Leute wie Sie, die diese Community großartig machen. Nachdem ich deine Antwort angesehen habe, habe ich meinen Code ein wenig überarbeitet, um die Dinge vielleicht in dem Kontext arbeiten zu lassen, in dem mein Lehrer sie benötigt. Du sagtest Tiere haben ein Bild, aber das ist irgendwie das, wofür ich es brauche. Ich werde meinen ursprünglichen Beitrag bearbeiten, um den neuen Code zu zeigen, wenn Sie wieder einen Blick darauf werfen wollen –

+0

Ich sehe definitiv, was Sie über die Null-Layout-Sache meinen, es macht wirklich Dinge peinlich. –

Verwandte Themen