2010-03-06 6 views
10

Ich habe ein Java-Projekt mit einer Symbolleiste, und die Symbolleiste enthält Symbole. Diese Symbole werden in einem Ordner mit dem Namen resources/gespeichert, so dass der Pfad beispielsweise "resources/icon1.png" lautet. Dieser Ordner befindet sich in meinem src-Verzeichnis. Wenn er kompiliert wird, wird der Ordner in bin/Wie auf Ressourcen in JAR-Datei zugreifen?

kopiert. Ich verwende den folgenden Code, um auf die Ressourcen zuzugreifen.

protected AbstractButton makeToolbarButton(String imageName, String actionCommand, String toolTipText, 
     String altText, boolean toggleButton) { 

    String imgLocation = imageName; 
    InputStream imageStream = getClass().getResourceAsStream(imgLocation); 

    AbstractButton button; 
    if (toggleButton) 
     button = new JToggleButton(); 
    else 
     button = new JButton(); 

    button.setActionCommand(actionCommand); 
    button.setToolTipText(toolTipText); 
    button.addActionListener(listenerClass); 

    if (imageStream != null) { // image found 
     try { 
      byte abyte0[] = new byte[imageStream.available()]; 
      imageStream.read(abyte0); 

      (button).setIcon(new ImageIcon(Toolkit.getDefaultToolkit().createImage(abyte0))); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       imageStream.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } else { // no image found 
     (button).setText(altText); 
     System.err.println("Resource not found: " + imgLocation); 
    } 

    return button; 
} 

(imagename wird "resources/icon1.png" usw. sein). Dies funktioniert gut, wenn Sie in Eclipse ausgeführt werden. Wenn ich jedoch ein ausführbares JAR aus Eclipse exportiere, werden die Symbole nicht gefunden.

Ich habe die JAR-Datei geöffnet und der Ressourcenordner ist da. Ich habe alles versucht, den Ordner verschoben, die JAR-Datei geändert usw., aber ich kann die Symbole nicht sehen.

Weiß jemand, was ich falsch mache?

(Als Nebenfrage, gibt es einen Dateimonitor, der mit JAR-Dateien arbeiten kann? Wenn Pfadprobleme auftreten, öffne ich FileMon normalerweise, um zu sehen, was passiert, aber in diesem Fall wird nur die JAR-Datei angezeigt)

Danke.

+1

Also 5 Zeilen Code zum Laden des Symbols ist besser, dann 2 Zeilen Code?Um das Geheimnis der Verwendung von zwei Codezeilen zu finden, müsste man natürlich selbst etwas lesen. Ich denke, das Geheimnis wird verborgen bleiben. – camickr

Antwort

5

Um ein Bild aus einer JAR-Ressource verwenden Sie den folgenden Code zu laden:

Toolkit tk = Toolkit.getDefaultToolkit(); 
URL url = getClass().getResource("path/to/img.png"); 
Image img = tk.createImage(url); 
tk.prepareImage(img, -1, -1, null); 
+0

In welchem ​​Paket ist das Toolkit enthalten? – tomasb

+0

@tomasb java.awt.Toolkit – Christian

10

Ich sehe zwei Probleme mit Ihrem Code:

getClass().getResourceAsStream(imgLocation); 

Dies setzt voraus, dass die Bilddatei als .class-Datei der Klasse im selben Ordner ist dieser Code aus ist, nicht in einem separaten Ordner Ressourcen. Versuchen Sie stattdessen:

getClass().getClassLoader().getResourceAsStream("resources/"+imgLocation); 

Ein weiteres Problem:

byte abyte0[] = new byte[imageStream.available()]; 

Verfahren InputStream.available() tut nicht Rückkehr die Gesamtzahl der Bytes im Stream! Sie gibt die Anzahl der verfügbaren Bytes ohne Blockierung zurück, was oft viel weniger ist.

Sie müssen eine Schleife schreiben, um die Bytes in ein temporäres ByteArrayOutputStream zu kopieren, bis das Ende des Streams erreicht ist. Verwenden Sie alternativ getResource() und die createImage()-Methode, die einen URL-Parameter verwendet.

4

Der Abschnitt aus dem Swing-Tutorial auf How to Use Icons zeigt Ihnen, wie Sie eine URL erstellen und das Symbol in zwei Anweisungen lesen.

0

Zum Beispiel in einem NetBeans-Projekt, einen Ressourcen-Ordner im src Ordner erstellen. Stellen Sie Ihre Bilder (jpg, ...) dort ein.

Ob ImageIO oder Toolkit verwenden (einschließlich getResource), müssen Sie umfassen ein führender/in Ihrem Pfad zur Bilddatei:

Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/agfa_icon.jpg")); 
setIconImage(image); 

Wenn dieser Code in Ihrem JFrame Klasse ist, wird das Bild hinzugefügt der Rahmen als Symbol in Ihrer Titelleiste.

Verwandte Themen