Bilder werden in App mit Jar-Datei nicht angezeigt

Womue18

Mitglied
Hallo,
ich habe auf meinem Mac mit Netbeans mehrer Java-Programme mit integrierter Derby-Datenbank geschrieben und in App's eingebunden (s. Bild).
Im Programm werden beim Aufrufen von Datensätzen die jeweils zugehörigen, außerhalb der Datenbank abgelegte Bilder angezeigt.
Das hat bisher einwandfrei geklappt.
Nach einem Update meines Rechners auf 'Catalina' laufen die Programme nach Start durch die App's zwar wie bisher, nur werden nun die Bilder nicht mehr angezeigt.
Teste ich die Programme in Netbeans oder starte ich sie nach dem Öffnen des Paketinhalts der App über den 'launcher', werden die Bilder wieder angezeigt.
Ich vermute, es könnte an der Datei 'info.plist' liegen.
Da ich Laie bin und mir das Erstellen der App's, 'info.plist' und 'launcher' aus dem Internet zusammengesucht habe und somit ihre genaue Funktion nicht kenne, finde ich keine Lösung wie die Bilder wieder angezeigt werden können.

Kann mir hier jemand helfen?
 

Anhänge

  • App-Aufbau.png
    App-Aufbau.png
    22,6 KB · Aufrufe: 5
  • Foto info.plist.png
    Foto info.plist.png
    66,3 KB · Aufrufe: 9
  • Foto launcher.png
    Foto launcher.png
    82,9 KB · Aufrufe: 8
1. Poste doch mal die Zeilen des Codes, wo so ein Bild eingelesen wird.
2. Lass vor so einer Zeile mal den Pfad eines Bildes in der Konsole ausgeben und poste auch, was dort steht.

ps: Hast du schon Clean&Build ausgeführt? Manchmal müssen die Jar-Dateien von Grund auf neu erstellt werden, wenn man Resourcen ändert.
 
Hallo Neumi5694,
ich weiß leider nicht was Clean&Build ist. Ich lasse das Programm jedoch nach jeder Änderung unter Netbeans neu bereinigen und erstellen und stelle dann jeweils die neueste Jar-Datei in die App ein.
Bevor ich 'Catalina' installiert hatte wurden die Bilder nach starten der App ja angezeigt. Ich vermute es liegt am Aufbau der App der für 'Catalina' nicht richtig ist.
Im Anhang nun wie gewünscht Bilder vom Code und Ausdruck des Pfades
 

Anhänge

  • Ausdruck Pfad.png
    Ausdruck Pfad.png
    37,4 KB · Aufrufe: 4
  • Bild anzeigen.png
    Bild anzeigen.png
    38,9 KB · Aufrufe: 5
Netbeans, rechte Maustaste auf Projekt. Dritter Punkt von oben.
Der Pfad ist ... seltsam. Wenn ich mir den anschue, würde ich vermuten, dass das Bild in deinem Home-Verzeichnis liegen soll, was ich aber nicht glaube, da zumindest unter Windows "/Users/name" nicht auf dein Home-Verzeichnis verweist und unter Linux würde es auch nicht passen. Da es in Netbeans so funktioniert, nehme ich an, es handelt sich um ein Unterverzeichnis deiner Resourcen.

Aber der springende Punkt ist ein anderer: Falls - so wie ich das verstanden habe - das Bild sich innerhalb einer Jar befindet, dann musst du Java auch sagen, dass dem so ist.
[CODE lang="java" title="getResource"]InputStream in = getClass().getResourceAsStream("/User/[...]/file.txt")[/CODE]
Daraus kannst du es dann einlesen.
 
Alle Bilder liegen außerhalb des Java-Programms in den Pfaden wo die Cad-Datein für die Bauteile liegen.. Sie werden zur Laufzeit jeweils in ein jLabel-Feld geladen wenn das entsprechende Bauteil angezeigt wird.

Übrigens werden auch Pdf-Dateien die separat abgelegt sind zunächst nicht angezeigt und es kommt eine Fehlermeldung (s. Bild). Auch wenn der Hinweis in der Meldung durchgeführt wurde wird die Pdf-Datei nicht angezeigt. Erst wenn ich die Datei dann in der Vorschau geöffnet habe läßt sie sich aus dem Programm heraus öffnen und zwar immer.
Beide Probleme müssen damit zu tun haben, dass sich in 'Catalina' etwas im Behandeln von APP's geändert hat
 

Anhänge

  • Fehlermeldung.png
    Fehlermeldung.png
    36,4 KB · Aufrufe: 3
Was mir an den Pfaden nicht gefällt, ist vor allem, dass das Home-Verzeichnis hardcodiert hinterlegt ist.
Ohne es direkt im Code zu hinterlegen, kriegst du dein User-Verzeichnis so:
Java:
System.getProperty("user.home");

So kannst du anzeigen lassen, wie der tatsächliche Dateiname lautet, wenn du sie öffnen willst
Code:
new File(bild).getAbsolutePath()

Hiermit kannst du prüfen, ob die einzulesende Datei existiert
Java:
new File(bild).exists()

und damit, ob du sie einlesen darfst (Rechteprobleme hast du ja schon angesprochen)
Java:
new File(bild).canRead()

Es mag sein, dass alles an den Rechten liegt, die dein Java JRE hat.
Mir ist aufgefallen, dass deine Ausgabe von der IDE stammte. Vor allem, wenn du die Rechte prüfst, solltest du die Ausgabe betrachten, die beim Starten der Jar erzeugt wird.
 
Zunächst besten Dank für die Bemühungen.
Die App mit Jar-Datei und der Derby-Datenbank liegt im Verzeichnis 'Programme'. Alle Bilder liegen in unterschiedlichen Pfaden jeweils bei den Konstruktionen der Bauteile. In der Datenbank sind daher für jedes Bauteil nicht die Bilder sondern nur die Dateipfade und Bildnamen abgespeichert, die sich aus verschiedenen Informationen der Bauteile zusammensetzen.
Beim Scrollen durch die Bauteile ändern sich also ständig Pfad und Bildname. Dadurch kann ich m.E. den Pfad nicht abfragen, sondern muß dem Programm sagen in welchem Pfad das Bild liegt und wie es heißt.
Beim Testen in Netbeans und beim Starten des Programms über den Launcher in der APP werden die Bilder ja angezeigt.
Starte ich die APP oder Jar-Datei direkt kommen keine Bilder.
Lösche ichdie Datei 'launcher' aus der App, startet das Programm nicht und es gibt die Fehlermeldung dass das Programm nicht geöffnet werden kann.
Das Löschen der 'info.plist'-Datei aus der APP hat bei mir keinen Einfluß auf die Ausführung des Programms gezeigt.

Ich habe versucht die Vorschläge im Programm einzubauen; leider auch ohne Erfolg.
 
Das waren keine Vorschläge für die Lösung, sondern um draufzukommen, was überhaupt das Problem ist.
Wenn die Pfade richtig sind (File.exists()), dann solltest du beim direkten Starten mal prüfen, ob du Zugriffsrechte darauf hast (File.canRead()).
 
Es ist nicht bei jedem Bauteil in Bild vorhanden.
Ich habe daher die Routine 'BildAnzeigen' noch einmal geändert und frage nun ab, ob das File gelesen werden kann und lade dann das ImageIkon und einen entsprechenden Text in das jLabelBild.
Das funktioniert in Netbeans und beim Starten über den launcher in der App.
Beim Starten der App wird der Text richtig angezeigt ( Bild vorhanden -> kein Text ; Bild nicht vorhanden -> Text ).
D.h. ich habe die Zugriffsrechte
Das Bild ( ImageIkon ) erscheint aber nicht.
Es scheint, dass die Umwandlung des Strings 'bild' in ein ImageIkon unter 'Catalina' nicht funktioniert.
 

Anhänge

  • BildAnzeigen.png
    BildAnzeigen.png
    127,1 KB · Aufrufe: 2
D.h. ich habe die Zugriffsrechte
Nicht zwingend, nein. Ich weiß nicht, welche JRE für die App verwendet wird und ob die mit dem selben Benutzer läuft wie beim Doppelklick der Jar.

Deshalb wiederhole ich: Lass dir währende der Ausführung der Jar ausgeben, a) welcher Pfad verwendet wird, b) ob die Datei esistiert und c) ob du Zugriffsrechte hast. Konzentrier dich auf den Fall, wo es NICHT funktioniert.
Verwende ein Bauteil, bei dem du weißt, dass das Bild verfügbar ist.

Es scheint, dass die Umwandlung des Strings 'bild' in ein ImageIkon unter 'Catalina' nicht funktioniert.
Ein String wird niemals in ein Bild umgewandelt. Aus dem String wird ein File-Objekt erstellt, darauf ein Stream, der Stream wird eingelesen und in ein Bild umgewandelt.
Deshalb musst du jetzt bitte prüfen, ob während der Laufzeit der Pfad passt, die Datei existiert und du Rechte hast.
 

Ich frage jetzt Deinem Vorschlag folgend das Home-Verzeichnis mit 'System.getProperty("user.home") ;' ab.
Die Pfade sind richtig, dieDateien ( png-Bilder ) existieren. Die Bilder werden in Ikon's umgewandelt und die Ikon's im Label angezeigt.
Im Betriebssystem 'Catalina' wird ein Bild wenn es in der Jar liegt im Label angezeigt, wenn es außerhalb liegt nicht.
Es geht wohl um geänderte Zugriffsrechte unter 'Catalina'.
Ich habe das Programm noch einmal auf einem Rechner mit dem Betriebssystem 'Yosemite' laufen lassen. Dort werden alle Bilder angezeigt.
Wie ich die Zugriffsrechte der Jar beim Starten der App prüfen kann weiß ich leider nicht.
Ich habe für die Dateien und Pfade die Informationen abgefragt und habe für alle die Zugriffsrechte für Lesen und Schreiben.
 
Die Umwandlung des Bildes in ein File -> BufferdImage -> ImageIkon hat unter Netbeans ebenfalls funktioniert in App allerdings nicht.
Wie das Bild über File -> Stream -> Stream einlesen geht weiß ich leider nicht.
 

Wie ich die Zugriffsrechte der Jar beim Starten der App prüfen kann weiß ich leider nicht.
mit file.canRead()
Wenn die Datei vorhanden ist und Rechte vorhanden sind, um sie zu lesen, dann ergibt der Wert true. Du startest die Jar und lässt dir den Wert ausgeben. Ob nun auf die Kommandozeile, in eine Log-Datei oder als Meldungsfenster, ist nicht wichtig.

Wie das Bild über File -> Stream -> Stream einlesen geht weiß ich leider nicht.
Die Methoden machen das schon. Habe dir nur erklärt, was da intern passier. Es wird jedenfalls nie ein String in ein Bild umgewandelt.

Zu "user.home": Gut, das wird dir in Zukunft einigen Ärger ersparen. Wo immer es vermeidbar ist, sollten Systemeigenschaften nicht hardcodiert stehen.
 
file.canRead() frage ich seit Deinem ersten Hinweis ab. Die Abfrage ergibt immer ein true. Die Bilder werden trotzdem nicht angezeigt. Der Text dass das File gelesen werden kann wird ebenfalls ausgegeben.
Bisher habe ich mit Netbeans 8.2 gearbeitet.
Wenn ich das Projekt in Netbeans 12.3 öffne kommt eine Fehlermeldung ( s. Anhang ). Damit komme ich aber auch nicht weiter.

Mein Problem ist, dass ich Laie bin.
Ich gebe jetzt auf und starte das Programm über den launcher in der App.

Recht herzlichen Dank für Deine Mühe und die hilfreichen Tipp's die mich in meinen Kenntnissen wieder etwas voran gebracht haben.
 
Gut, wusste ich nicht. Du hast dich mit deinen Rückmeldungen immer auf Netbeans oder die App bezogen, nicht auf die Jar.

Im nächsten Schritt hätt ich die Sachen erst mal als Streams einlesen lassen und dann schrittweise weitergemacht.

Wünsche dir auf jeden Fall noch viel Erfolg.
 

Zurück
Oben