Bild in JEditorPane

Diskutiere Bild in JEditorPane im Java Basics - Anfänger-Themen Bereich.
VPChief

VPChief

Hallo,

ist es eigentlich möglich ein Bild aus der Jar in eine JEditorPane einzufügen?
Auf Google finde ich jetzt nicht so direkt etwas das funktioniert.
 
J

JustNobody

Was hast du denn ausprobiert? Ein Versuch könnte sein, dass man eine URI vom Classloader bekommt (Also z.B. per getClass().getResource) um so dann eine URL (toURL Aufruf) zu bekommen, die man mal probieren könnte. Aber ich weiss nicht, ob der JEditorPane die richtig laden kann bzw. ob da eine URL bei raus kommt oder eine Exception geworfen wird. Aber das ist ja ein schneller Test so man nicht wie ich am Handy sitzt....

Die zweite Möglichkeit wäre, das Bild selbst zu laden und dann base64 encoded in das html einzufügen. Das sollte aus meiner Sicht funktionieren.

Das wäre so, was ich probieren würde in der Reihenfolge.
 
VPChief

VPChief

Was hast du denn ausprobiert? Ein Versuch könnte sein, dass man eine URI vom Classloader bekommt (Also z.B. per getClass().getResource) um so dann eine URL (toURL Aufruf) zu bekommen, die man mal probieren könnte. Aber ich weiss nicht, ob der JEditorPane die richtig laden kann bzw. ob da eine URL bei raus kommt oder eine Exception geworfen wird. Aber das ist ja ein schneller Test so man nicht wie ich am Handy sitzt....
Das habe ich schon versucht
Die zweite Möglichkeit wäre, das Bild selbst zu laden und dann base64 encoded in das html einzufügen. Das sollte aus meiner Sicht funktionieren.
kannst du mir das genauer erklären...
 
J

JustNobody

Den Link zu SelfHTML habe ich dir ja schon gegeben. Der erläutert, wie es aussieht. Die Base64 Kodierung solltest du bekommen, indem Du
a) das Bild in ein byte Array liest
b) die Bytes dann Base64 kodierst: Base64.getEncoder().encodeToString(bytes); sollte das schon machen ...

Aber das habe ich so selbst noch nicht ausprobiert, aber wie gesagt: Das wäre der zweite Versuch, den ich starten würde ...
 
VPChief

VPChief

Was hast du denn ausprobiert? Ein Versuch könnte sein, dass man eine URI vom Classloader bekommt (Also z.B. per getClass().getResource) um so dann eine URL (toURL Aufruf) zu bekommen, die man mal probieren könnte. Aber ich weiss nicht, ob der JEditorPane die richtig laden kann bzw. ob da eine URL bei raus kommt oder eine Exception geworfen wird. Aber das ist ja ein schneller Test so man nicht wie ich am Handy sitzt....
Ich habe das jetzt irgendwie gebastelt, aber naja...
Java:
File file = null;
            file = new File("" + (InputStream) Programm6.class.getResourceAsStream("/Neuer Ordner/picture.html"));
             URL url = null;
            try {
                url = new URL("file//"+ file);
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
  
             System.out.println(url);
          
             try {
                url = file.toURI().toURL();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
             System.out.println(url);
            editorPane.setPage(url);
        }
Den Pfad den er mir ausgibt ist:
file:/C:/Users/Unkenttlichgemachteruser/eclipse-workspace/forum/java.io.BufferedInputStream@7d907bac

Was die EditorPane ausgibt ist Page not Found, was ja irgendwie klar ist.:D

kann man das dann irgendwie korrigieren?
 
J

JustNobody

Das ist beide Ideen wild durcheinander gemixt .... Und das mit Dingen, die keinen Sinn machen ...

Wenn du über den InputStream gehst, dann musst du den nutzen um das Bild in ein byte Array zu laden. Dieses könnte man dann Base64 kodiert nutzen.

Der Weg URI -> URL müsste natürlich die URI der Datei im jar holen (also getResource statt getResourceAsStream). Da bekommst du dann direkt die URI auf der ein toURL aufgerufen werden könnte...

Die Korrektur wäre also, es so zu implementieren, wie es beschrieben wurde bzw. sich bei Problemen die notwendigen Grundlagen anzueignen... bei deinem Code wäre jede Korrektur wohl: löschen des Codes und richtig machen ... ok, die paar Zeichen mit dem getResourceAsStream kann man lassen, aber ohne den Rest der Zeile drumherum ... Oder wenn nicht der Base64 Weg genommen werden soll, dann darf alles weg bis auf die letzte Zeile wenn man das Laden einer URL testen will und nicht ein html mit entsprechendem img Tag erzeugt ...
 
J

JustNobody

Ich habe mir jetzt einmal die Zeit genommen und es selbst etwas durchgetestet. Das Ergebnis ist relativ deutlich:
a) getResource liefert bereits eine URL und keine URI (Schande auf mein Haupt!) - daher spart man sich den toURL Aufruf.
b) JEditorPane kann problemlos URL laden, die eine Datei innerhalb des jar Files beschreibt
c) Deine Idee, die URL direkt an die JEditorPane zu geben bringt nichts, denn das Bild wird als Test gelesen und dann entsprechend angezeigt ...
d) daher: html code erzeugen, der ein <img src="...."/> hat (und da dann natürlich statt der ... die URL, die getResource liefert) und schon wird das Bild korrekt angezeigt.

Die base64 Variante funktioniert bei mir jedoch nicht. Das html, welches ich generiere, wird von z.B. Chrome korrekt angezeigt, aber JEditorPane zeigt das Bild leider nicht an. Das hat mich etwas überrascht, denn ich hatte eher ein umgekehrtes Ergebnis erwartet. Aber die erste Variante funktioniert und das ist aus meiner Sicht eh der deutlich bessere Weg!
 
J

JustNobody

Also wie beschrieben:
  1. URL per getResource holen (Meine Klasse heisst JEditorPaneTest - nicht dass du dadrüber stolperst...)
  2. HTML aufbauen mit img src=url
  3. Der JEditorPane das als HTMl Code geben
Java:
URL url = JEditorPaneTest.class.getResource("/test.png");
String htmlCode = "<html><body><img src=\"" + url + "\" /></body></html>";
JEditorPane pane = new JEditorPane("text/html", htmlCode);
 
VPChief

VPChief

Also wie beschrieben:
  1. URL per getResource holen (Meine Klasse heisst JEditorPaneTest - nicht dass du dadrüber stolperst...)
  2. HTML aufbauen mit img src=url
  3. Der JEditorPane das als HTMl Code geben
Java:
URL url = JEditorPaneTest.class.getResource("/test.png");
String htmlCode = "<html><body><img src=\"" + url + "\" /></body></html>";
JEditorPane pane = new JEditorPane("text/html", htmlCode);
danke, funktioniert, vielen dank:)
 
Thema: 

Bild in JEditorPane

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben