当前位置: 首页 > 面试题库 >

具有内嵌图像的JEditorPane

闻人宝
2023-03-14
问题内容

我正在尝试在Java
JEditorPane中显示嵌入式图像。下面的代码使用HTML内容,这些内容可以在Firefox中正确显示图像,但不能在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();}
}

问题答案:

您需要为“数据:”添加协议处理程序,以便可以为其打开URL / URLConnection。或者,您可以为类路径资源创建一些协议处理程序“
resource:”。

您需要一个data带有类的包Handler(固定名称约定!)。这将是“数据:”的工厂类,返回URLConnection。我们将为此创建DataConnection。

可以通过System.setProperty完成协议处理程序的安装。在这里,我提供了Handler.install();以一般方式进行的操作。

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为字节提供InputStream:

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);
    }

}

聪明的地方是DatatypeConverter在标准Java SE中使用Base64解码。

聚苯乙烯

如今人们会使用Base64.getEncoder().encode(...)



 类似资料:
  • 问题内容: 前一段时间,我花了一些时间来寻找确定两个图像是否相同的方法,以回答[这个问题](http://codingdict.com/questions/100055。我现在面临一个稍微不同的问题:我手头大约有两千张图像,其中一些具有相同的内容,但是彼此缩放/旋转(旋转始终为90°的倍数),还有一个问题。不同的压缩方式和图像格式(主要是jpg,一些png和其他格式)。缩放比例不会超过2:1。我想

  • 问题内容: 如何在JPANEL上放置图像背景? 问题答案: 这是一个解释。

  • 问题内容: 我试图在我的简单GUI上显示一些卡,但是没有显示。 我已使用要上传的.gif上传了一个工作文件,该代码已关闭但不正确。 http://www.filedropper.com/cardgameproblem大小:0Kb,类型:.zip 包含1个.py和1个.gif 要看的线始于257-266。我知道这只是一个小错误,但我看不到它。 请帮忙 问题答案: 经过一番修补,我发现当将图像存储在G

  • 我在努力 服务器:版本:1.11.2 API版本:1.23 Go版本:Go1.5.4 Git提交:b9f10c9构建:Wed Jun 1 22:00:43 2016 OS/arch:linux/amd64

  • 我有这个图像,我想选择其中的所有地图,包括使用python的名称。 我用OpenCv试过了 但是我总是得到这个错误: OpenCV(4.2.0)C:\projects\OpenCV python\OpenCV\modules\imgproc\src\templammatch。cpp:1104:错误:(-215:断言失败)(深度==CV\U 8U | |深度==CV\U 32F) 我该怎么做?请帮帮

  • 问题内容: 如果我的窗口处于32位色深模式,那么下面的代码将从窗口中获取漂亮的PIL图像: 但是,以16位模式运行时,出现错误: 我应该如何形成以16位模式工作的电话?另外,如何使该函数在任何位深度模式下都能工作,而不必说必须将其作为参数传递呢? 更新:从这个问题中,我了解到我必须对第二个模式参数使用“ BGR; 16”而不是“ BGRX”。它可以拍出正确的照片,无论是否指定步幅。问题是像素值在某