在 Java 中使用 HTMLEditorKit,如何找到 <img src=...> 标签将使用的本地文件路径?

Using HTMLEditorKit in Java, how do I find what local file path <img src=...> tags will use?

我有一个 java 应用程序 运行ning,我正在使用 HTMLDocument/HTMLEditorKit 功能来构建我的聊天室。到目前为止,在构建样式表、插入文本消息等方面取得了很大的成功。

所以现在我来到了...图片!我 认为 如果我要添加如下标签:

<img src="myimage.png"> 

...当我 运行 它时,我的文件只需要与 java 应用程序位于同一目录中。但是我 运行 遍历了各种东西并尝试了子目录,但它似乎找不到我的本地图像。 (它发现它们在网上使用“http://etcetcetc”就好了)。

我搜索这些东西的所有文档大多都在谈论目录 "your html file is in",当然我 "really" 没有 html 文件,只有一个虚拟文件。

有没有办法询问它认为它正在读取的目录是什么?

我尝试将文件放在以下目录中:

System.getProperty("user.dir");

...但没有快乐。

在此处寻找某种相对路径,以便能够显示最终与应用程序一起安装在用户计算机上的图像文件。

[编辑:糟糕,修复了我的 HTML 示例]

Is there a way to ask it what directory it THINKS it's reading from?

不知道它是否应该在class文件所在的同一目录(或子目录)中,或者它是否可以在class路径中找到的任何目录中.

无论如何你的HTML是错误的:

<img="myimage.png"> 

应该是:

<img src="myimage.png"> 

或调整图片大小

<img src="myimage.png" width="64" height="64">

阅读 Using Text Components 上的 Swing 教程部分。 TextSamplerDemo 具有显示图像的工作代码。

好吧,我发现(从一些与其他问题相关的答案中收集到的花絮)我需要创建一个 URL 项,然后用 ClassLoader 或类似的程序填充它方法。

例如,一个人得到了他的东西:

String filename = getClass().getClassLoader().getResource("res/Kappa.png").toString();
String preTag="<PRE>filename is : "+filename+"</PRE>";
String imageTag="<img src=\""+filename+"\"/>";
kit.insertHTML(doc, doc.getLength(), preTag+imageTag, 0, 0, HTML.Tag.IMG);

同时,从这个提示中得出最终得到我的东西的方法 运行 "the best" 是:

    URL url;
    String keystring = "<img src=\"";
    String file, tag, replace;
    int base;
    while (s.toLowerCase().contains(keystring)) { // Find next key (to-lower so we're not case sensitive)
        //There are undoubtedly more efficient ways to do this parsing, but this miraculously ran perfectly the very first time I compiled it, so, you know, superstition :)
        base = s.toLowerCase().indexOf(keystring);
        file = s.substring(base + keystring.length(), s.length()).split("\"")[0]; // Pull the filename out from between the quotes
        tag  = s.substring(base, base + keystring.length()) + file + "\""; // Reconstruct the part of the tag we want to remove, leaving all attributes after the filename alone, and properly matching the upper/lowercase of the keystring                        

        try {
            url = GameModule.getGameModule().getDataArchive().getURL("images/" + file);
            replace = "<img  src=\"" + url.toString() + "\""; // Fully qualified URL if we are successful. The extra
                                                                // space between IMG and SRC in the processed
                                                                // version ensures we don't re-find THIS tag as we
                                                                // iterate.
        } catch (IOException ex) {
            replace = "<img  src=\"" + file + "\""; // Or just leave in except alter just enough that we won't find
                                                    // this tag again.
        }

        if (s.contains(tag)) {
            s = s.replaceFirst(tag, replace); // Swap in our new URL-laden tag for the old one.
        } else {
            break; // BR// If something went wrong in matching up the tag, don't loop forever
        }
    }

    //BR// Insert a div of the correct style for our line of text. 
    try {
        kit.insertHTML(doc, doc.getLength(), "\n<div class=" + style + ">" + s + "</div>", 0, 0, null);
    } catch (BadLocationException ble) {
        ErrorDialog.bug(ble);
    } catch (IOException ex) {
        ErrorDialog.bug(ex);
    }
    conversation.update(conversation.getGraphics()); //BR// Force graphics to update

我的包在 VASSAL(游戏平台)下运行,因此能够从我的 VASSAL 模块的数据存档(zip 文件)中提取东西对我来说是理想的,尽管当时我提出了我会问的问题很高兴只是找到 任何地方 我可以让它找到一个图像文件并将其从数据存档中取出是后来的扩展目标。

你可以在这里看到我的策略是让 html(可能由另一个模块设计者生成,而不是我)在源标签中引用简单的文件名(例如 src="dice.png" ) 然后我将它们解析出来,如果成功,则用 URL 查询的结果替换它们。

如果有人对原始问题的主旨有更完整的答案(HTMLEditorKit 到底在哪里寻找本地 PATHS?--默认的本地路径是什么?我怎样才能让它在我当前的工作目录中查找,或者应用程序来自 运行 的目录,或者任何类似的本地目录)然后请在这里 post 这样做 post ,因为尽管这让我 运行 我不觉得这是对原始问题的全面回答。