2016-03-21 7 views
1

Ich habe ein Problem mit Bildsymbolen. Ich weiß, dass das schon einmal gefragt wurde, aber ich kann mir nicht vorstellen, wie ich das beheben kann, weil ich glaube, dass mein Problem anders ist. Wenn ich App mit Eclipse starte, funktioniert alles. Aber wenn ich es runnable Glas mache, wird es keine Bilder zeigen.Glas wird nicht angezeigt Bilder

Einige Code meiner ImagesHolder Klasse:

package Clicker; 

import javax.swing.ImageIcon; 

public class ImagesHolder { 

     final public ImageIcon AccessoriesIcon = new ImageIcon("Images/Part_Accessories.png"); 
     final public ImageIcon BodyIcon = new ImageIcon("Images/Part_Body.png"); 
     final public ImageIcon BrakesIcon = new ImageIcon("Images/Part_Brakes.png"); 
     final public ImageIcon CoolingIcon = new ImageIcon("Images/Part_Cooling.png"); 
     final public ImageIcon ElectronicsIcon = new ImageIcon("Images/Part_Electronics.png"); 
     final public ImageIcon EngineIcon = new ImageIcon("Images/Part_Engine.png"); 
     final public ImageIcon ExaustIcon = new ImageIcon("Images/Part_Exaust.png"); 
     final public ImageIcon FuelIcon = new ImageIcon("Images/Part_Fuel.png"); 
     final public ImageIcon InteriorIcon = new ImageIcon("Images/Part_Interior.png"); 
     final public ImageIcon SteeringIcon = new ImageIcon("Images/Part_Steering.png"); 
     final public ImageIcon SuspensionIcon = new ImageIcon("Images/Part_Suspension.png"); 
     final public ImageIcon TransmissionIcon = new ImageIcon("Images/Part_Transmission.png"); 
     final public ImageIcon TiresIcon = new ImageIcon("Images/Part_Tires.png"); 

Und wenn ich Bilder als URL zu machen, kann ich nicht Bild-Symbole zurückgesetzt, wie hier (ich habe Labels und ich möchte Label Symbol ändern)

Labels Beispiel:

public JLabel AccessoriesLVL1Label = new JLabel(ImagesHolder.LockedIcon); 
    AccessoriesLVL1Label.setHorizontalTextPosition(JLabel.CENTER); 
     AccessoriesLVL1Label.setVerticalTextPosition(JLabel.BOTTOM); 
     AccessoriesLVL1Label.setText("<html>Accessories LVL 1<br>" + "Count: " + Part.parts[1]); 

und ändern:

if(CarMain.main[5] >=1){ 
      jbtnSellAccessoriesLv1.setEnabled(true);  
      Labels.AccessoriesLVL1Label.setIcon(ImagesHolder.AccessoriesIcon);   
     } 

Editiert: Wenn ich dies:

final public ImageIcon MoneyIcon = new ImageIcon("Images/Money.png"); 

Stellen wie:

URL MoneyIcon = ImagesHolder.class.getResource("/Money.png"); 

ich Fehler in dieser Zeile erhalten:

Labels.MoneyLabel.setIcon(ImagesHolder.MoneyIcon); 

Fehler:

The method setIcon(Icon) in the type JLabel is not applicable for the arguments (URL) 
+0

Die erste Sache ist zuerst, haben Sie überprüft, dass sie im Glas sind? Nur für den Fall ... –

+0

@ user3272243 Ja, ich öffnete JAR-Datei als zip, und es gab alle Bilder. Aber sie waren im Hauptordner, nicht im Bilderordner. Ich habe versucht, Image Location (In Code, um zu arbeiten, wenn Bilder im Hauptordner sind) zu ändern, aber zeigte noch kein Image – MsCrelix

+0

Wenn Sie sie in den Krug bewegen, als ob es eine Zip an den "richtigen Ort" wäre Sie arbeiten? Versuchen Sie auch, eine absolute Route zu verwenden und platzieren Sie sie an diesem Ort, um zu sehen, ob das Glas so funktioniert, um zu verwerfen, wenn es das Glas nicht funktioniert oder wenn es ein Problem an Ihrer Seite ist. –

Antwort

2

Nun, um die zuvor gegebenen Antworten zusammenzufassen: Ich denke, eine mögliche Lösung wäre classloader als Dark Knight vorgeschlagen. Außerdem müssen Sie nur einen neuen ImageIcon erstellen, bevor Sie ihn einstellen.

Weil, wenn Sie Ihren Code erneut durchsehen, ich denke, es macht etwas Sinn, es funktioniert nicht. Ich meine, Sie wollen eine ImageIcon setzen, aber das letzte, was Sie haben, ist ein URL Objekt. Dass dies einen Fehler auslösen muss, sollte sinnvoll sein. Aber wie Andrew Thompson bereits sagte: Sie können eine ImageIcon von dieser URL wie oben gezeigt/erklärt erstellen.

Und da Sie auch erklärt haben, dass Sie Probleme mit den Verzeichnissen hatten (die Struktur von Quelle zu kompiliert bekommen), möchte ich einige Links für weitere Lektüre hinzufügen: Wenn Sie nur "plain" Java (keine Build-Tools) verwenden Link kann helfen: Copying data files upon build in Java/Eclipse. Es ist hauptsächlich für Eclipse geschrieben, aber ich denke, die meisten anderen IDEs sollten ähnliche Optionen bieten.

Von meinen aktuellen Projekten könnte ich auch empfehlen, ein Werkzeug wie Maven zu verwenden. Bei kleineren Projekten mag es etwas übertrieben sein, aber es erfordert viel Arbeit (z. B. Bibliotheksverwaltung, Umgang mit Ressourcen wie Bildern usw.). Dies sind nur einige Teile, die für Sie nützlich sein könnten. Wenn dies für Sie von Interesse ist, werden Sie wahrscheinlich viele nützliche Ressourcen im Internet finden, da Maven (oder andere Tools wie Ant und Gradle) recht häufig verwendet werden.

3

Es gibt eine Alternative zum Abrufen von Bildern aus JAR-Datei:

Idealerweise wäre ein Ressourcenverzeichnis unter Ihrem Projektstammverzeichnis und es in die Liste der Quellcodeverzeichnisse aufzunehmen. Dies führt dazu, dass alle Bilder in das JAR kopiert werden. Wenn Sie dort ein Unterverzeichnis erstellen, resources/image, erhalten Sie eine JAR mit einem Bildverzeichnis. Der Zugriff auf diese Bilder durch den Klassenlader:

classloader.getResourceAsStream("/image/image1.jpg"); 

oder

classloader.getResource("/image/image2.jpg"); 

Siehe this Link im Detail Beispiel.

+0

Bitte überprüfen Sie meine Edit. – MsCrelix

+0

* "Es gibt eine Alternative zum Abrufen von Bildern aus der JAR-Datei: ..' getResource' "* Das klingt nach einem anderen Weg als den Zugriff auf die Ressource per URL. Eigentlich kann ich an eine "Alternative" denken, aber es ist zu schrecklich, um Details zu nennen. Nein. 'GetResource' (oder' getResourceAsStream') ist einfach ** der Weg ** um Ressourcen von Jar-Dateien zu bekommen. Alles andere ist eine "Alternative". –

+0

@MsCrelix Bitte stellen Sie sicher, dass Sie Bilder im Ressourcenverzeichnis haben. –