2012-02-22 12 views
10

Java JEditorPane'de bir satır içi resmi görüntülemeye çalışıyorum. Aşağıdaki kod, Firefox'ta görüntüyü doğru şekilde görüntüleyen ancak JEditorPane'de bulunmayan HTML içeriğini kullanır. Herhangi bir fikir neden? Teşekkürler.JEditorPane

import javax.swing.*; 
import java.awt.*; 

public class InlineImage { 

    public InlineImage() { 
     JFrame frame=new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JEditorPane edit=new JEditorPane(); 
     frame.getContentPane().add(edit); 
     edit.setContentType("text/html"); 

     String html = "<html><body>Local image<br><img src=\"data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAACeklEQVR42u1bHZBCURgNgiBYCINgIVhYCIKFhSBYCIIgCIKFxSBoZpsJgjAIgmAhCIIgCIKFIAiChSAIF4IgCL7d82abnWl69Xq9+7r1Dhyp93PfOff7ufd+n8/nEyF0AkmgIAQFoSDEjQgSCn1LPD6SbPZDSqWKNBqv0m5nZDh8lsnkUebziIH1OiC/d+wF/tteN50+GPfiGbVaQcrld8nnm8Y78C4K8odAYC3R6Jfkci2pVosGaYtFWDYbvynRKgDx8G4Ij7FgTBjbzQuC2ZhOd4wZCgIOzfBLYysSxooxh8OL2xAEH4KPGo3irs98pwF3CZcXi42vS5CtCPiAaxfBDLPZvRQKNUWW49CDEomBdDrpmxXBDN1uSlKprvj9m8sLgkHAx47HMU+JYObSkBmenxDYvDGTaRum63UhdoFUG9maa4IgW4KZkvzD6PVebMaYEy6GSS6XdyTcIlaroA1rsRgr6vU3zwVsp4BFZzC4ckYQBCmYH4k9D4NBwmLAP2IZFMNZUY6nxwf+rFRKJNJhYLVvSxAs9Bgz1ADcniQIzIprDLVbL+aua8+PyWSfxCkGOLYsSKuVI2mKAY4tC4LlP0lTv8ViWRAS5g4oyLUKQpelmctiUNcsqDPt1Szt5cJQs4Uht0402zrh5qKGm4tb19XvJ0mkq2ciPKC6ngOq3SNcEms/xXXsCJdFDhoWOeyWAdGFWSsDikTm7hXKwVq4VjEvlLNfWnpmKSkqGFlK+l9Kaj1WuFBs7cWKRrgmbYqtvdyOUCxW9W5HOCQOXBobdtjSxpY2J5o+L0W+55o+7bZFN5t5JW3RT0+fbIsmKAgFISgIBSHU4QdCoO0W7Xd4AwAAAABJRU5ErkJggg==\"></body></html>"; 
     edit.setText(html); 

     frame.setSize(500,300); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) {new InlineImage();} 
} 

cevap

15

Sen için bir protokol işleyicisi eklemeniz gerekir "veri:" öylesine bir URL/URLConnection bunun için açılabilir. Alternatif olarak, sınıf yolu kaynakları için bazı protokol işleyici "kaynak:" oluşturabilirsiniz.

data numaralı bir pakete, Handler sınıfına (sabit ad anlaşması!) Ihtiyacınız var. Bu, "data:" için bir URLConnection döndüren fabrika sınıfı olacaktır. Bunun için DataConnection oluşturacağız.

Bir protokol işleyicisi kurulması, System.setProperty yoluyla yapılabilir. Burada genel bir şekilde yapmak için Handler.install(); sağladı.

package test1.data; 

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import java.net.URLConnection; 
import javax.xml.bind.DatatypeConverter; 

public class DataConnection extends URLConnection { 

    public DataConnection(URL u) { 
     super(u); 
    } 

    @Override 
    public void connect() throws IOException { 
     connected = true; 
    } 

    @Override 
    public InputStream getInputStream() throws IOException { 
     String data = url.toString(); 
     data = data.replaceFirst("^.*;base64,", ""); 
     System.out.println("Data: " + data); 
     byte[] bytes = DatatypeConverter.parseBase64Binary(data); 
     return new ByteArrayInputStream(bytes); 
    } 

} 

burada zeki şey standart Java SE DatatypeConverter Base64 çözme kullanmaktır:

package test1.data; 

import java.io.IOException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.net.URLStreamHandler; 

public class Handler extends URLStreamHandler { 

    @Override 
    protected URLConnection openConnection(URL u) throws IOException { 
     return new DataConnection(u); 
    } 

    public static void install() { 
     String pkgName = Handler.class.getPackage().getName(); 
     String pkg = pkgName.substring(0, pkgName.lastIndexOf('.')); 

     String protocolHandlers = System.getProperty("java.protocol.handler.pkgs", ""); 
     if (!protocolHandlers.contains(pkg)) { 
      if (!protocolHandlers.isEmpty()) { 
       protocolHandlers += "|"; 
      } 
      protocolHandlers += pkg; 
      System.setProperty("java.protocol.handler.pkgs", protocolHandlers); 
     } 
    } 
} 

URLConnection bayt bir InputStream verir.


Not;

Günümüzde Base64.getEncoder().encode(...) kullanılacaktır.

+0

* "Buradaki akıllı şey" * Beni düşünmeye iten yaklaşık 4 şey gördüm - Vay canına, bu zekice! Günümün 'öğelerini (öğeleri) öğreniyorum. :) –

+0

Detaylı cevap için teşekkür ederiz! Bunu deneyeceğim. – Mike

+0

Bir çekicilik gibi çalıştım! Çok teşekkürler. Cevabınızı araştırmak bir soru ortaya çıkardı. Java.protocol.handler.pkgs özelliğinin başlangıçta JVM tarafından okunması gerçeğine dair birkaç başvuru buldum, bu nedenle işleyicilerin komut satırında bulunması gerekir (ör. Java -Djava.protocol.handler.pkgs = xxxxxx). Ama sadece main() yöntemimde test1.data.Handler.install() işlevini çağırdım ve işe yaradı. Java'nın daha yeni sürümlerinde davranış değişti mi, yoksa yanlış mı okudum? – Mike