2012-08-28 5 views
7

Ich habe ein Java-Projekt namens MyProject. Ich habe ein paar verschiedene Pakete (Namen einfach für die Zwecke dieser Frage halten), wie folgt:Laden Sie Java-Image innerhalb des Pakets von einer Klasse in einem anderen Paket

src/PackageA 
src/PackageA/PackageAa 
src/PackageA/PackageAa/PackageAaa 
src/PackageB 
src/PackageB/PackageBa 
src/PackageB/PackageBa/PackageBaa 

Ich habe eine Klasse

src/PackageA/PackageAa/PackageAaa/MyJavaFile.java 

und ich habe ein Bild

src/PackageB/PackageBa/PackageBaa/MyImage.png 

Innerhalb von MyJavaFile.java möchte ich ein Image-Objekt von MyImage.png

deklarieren

Wie kann ich das tun?

+1

F: Warum setzen Sie eine .png-Ressource in ein Java-Paket ein ??? Selbst wenn Sie Inhalte in eine .jar-Datei einfügen, haben Sie normalerweise ein separates Verzeichnis für Ressourcen ("/ resources" ist ein Pop-Favorit). Zum Beispiel: [Bild zu Glas hinzufügen] (http://stackoverflow.com/questions/1096398/add-image-to-jar-java). PS: Dieser Link beantwortet Ihre spezifische Frage ... aber ich würde davon abraten, wenn möglich. IMHO ... – paulsm4

+0

src/PaketB/PackageBa/PackageBaa/MyImage.png Paket ist Ordner –

+0

Image image = Toolkit.getDefaultToolkit(). GetImage ("Agent.gif"); – TechDog

Antwort

10

Sie entweder Class.getResource nennen könnte und einen Pfad angeben mit / starten, oder ClassLoader.getResource und nicht die Mühe mit dem /:

URL resource = MyJavaFile.class 
     .getResource("/PackageB/PackageBa/PackageBaa/MyImage.png"); 

oder:

URL resource = MyJavaFile.class.getClassLoader() 
     .getResource("PackageB/PackageBa/PackageBaa/MyImage.png"); 

Grundsätzlich Class.getResource können Sie eine Ressource relativ zu der Klasse angeben, aber ich nicht denke, ermöglicht es Ihnen, ".." usw. für Verzeichnisnavigation zu verwenden.

Natürlich, wenn Sie in dem richtigen Paket einer Klasse kennen, können Sie nur verwenden:

URL resource = SomeClassInPackageBaa.class.getResource("MyImage.png"); 

(Ich gehe davon aus Sie ein URL zum Image Konstruktor in Frage passieren können Es gibt auch getResourceAsStream. Sowohl Class als auch ClassLoader.)

+0

Wie bekomme ich eine BufferedImage von diesem Bild. – CodeGuy

+0

Eine Möglichkeit ist die Verwendung von 'ImageIO.read (URL)'. –

2

/folderB/folderBa/folderBaa/MyImage.png

Bild kann Projektordner Standort .eg speichern in: /images/MyImage.png

dann versuchen Sie es

Image img = new Image(/images/MyImage.png); 

Verwendung Ein Dateipfad ist nicht möglich, wenn ein Programm in einer JAR-Datei ausgeführt wird, insbesondere wenn das Programm als Applet- oder WebStart-Anwendung geladen wird. Dann können Sie mit ClassLoader ein Image erstellen.

den folgenden Code verwenden, um die Bilder zu laden:

ClassLoader cldr = this.getClass().getClassLoader(); 

    java.net.URL imageURL = cldr.getResource("/PackageB/PackageBa/PackageBaa/MyImage.png"); 
ImageIcon aceOfDiamonds = new ImageIcon(imageURL); 
+0

Ich stimme zu - Das Erstellen eines Verzeichnisses namens "/ images" ist eine viel klügere, bessere Übung als das Speichern Ihrer .png in einem Quellordner/Java-Paket. IMHO ... – paulsm4

+0

Ich brauche das Bild, nicht das Bildsymbol. Kann ich einfach getImage() – CodeGuy

+0

das ist falsch. Ich bekomme einen Nullzeiger. und ja, der Weg ist absolut richtig. – CodeGuy

0

Verwenden Sie die Methode getResource, um Ressourcen im Stamm src zu lesen. Der folgende Code ruft beispielsweise Bilder aus einem Ordner src/images ab.

// Get current classloader 
ClassLoader cl = this.getClass().getClassLoader(); 
// Create icons 
Icon saveIcon = new ImageIcon(cl.getResource("images/save.gif")); 
Icon cutIcon = new ImageIcon(cl.getResource("images/cut.gif")); 

Das Beispiel geht davon aus, dass die folgenden Einträge vorhanden sind in der JAR-Datei der Anwendung:

images/save.gif 
images/cut.gif 
1

Dies ist der beste Weg, um alle Bilder und Symbole in einer JAR-App zu behandeln.

Sobald Sie alle Ihre Bilder und Symbole in eine eigene JAR-Datei gezippt haben - Konfigurieren Sie den Build-Pfad, indem Sie die JAR-Datei für Bilder in Ihre Bibliotheksregisterkarte einfügen, sodass sie jetzt in Ihrem Klassenpfad enthalten ist.

Dann verwenden Sie einfach die folgenden 3x Codezeilen zu Beginn Ihres Konstruktor jedes Bild zugreifen, die Sie für alles, was mit einem SystemTray Bild benötigen, die nicht die einfache ImageIcon der als Hauptsymbol akzeptiert (komisch ich weiß) . Die 3x Linien sind:

URL iconUrl = this.getClass().getResource("/image-iconb.png"); 
    Toolkit tk = this.getToolkit(); 
    imageIcon = tk.getImage(iconUrl); 

(ImageIcon ist nur ein Konstruktor deklariert Bildgröße) Jetzt können Sie ein Fenster-Icon-Set so einfach wie:

setIconImage(imageIcon); 

und zugleich Verwenden Sie die selbe Variable, wenn Sie das System TrayIcon einstellen, indem Sie Folgendes angeben:

Mit dem oben genannten Verfahren können Sie Bilder oder ImageIcons einfach und zentral deklarieren, ohne das Risiko einzugehen, Bildressourcen nicht an der richtigen Stelle zu halten. Es hält es schön und ordentlich, mit der JAR, die alle Ihre Bilder automatisch zur Laufzeit und Verteilung Ihres Programms enthält.

Als Bonus, sobald die JAR in Ihrem Classpath registriert ist - können Sie ohne viel Aufhebens zu einer anderen Bilder in der gleichen JAR jederzeit halten das Hinzufügen - Alles funktioniert einfach und die hinzugefügten Bilder sofort verfügbar sind Ihre App

Viel besser aus meiner Sicht.

3

Sie können relativen Pfad verwenden, da der relative Pfad Projektordner ist.

ImageIcon img = new ImageIcon("src/PackageB/PackageBa/PackageBaa/MyImage.png"); 
Verwandte Themen