Используя HTMLEditorKit в Java, как мне найти путь к локальному файлу теги будете использовать? - PullRequest
0 голосов
/ 19 апреля 2020

У меня запущено приложение java, и я использую функциональность HTMLDocument / HTMLEditorKit для создания своей комнаты чата. До сих пор с большим успехом можно было строить мою таблицу стилей, вставлять текстовые сообщения и т. Д.

Итак, я пришел к ... изображениям! У меня было мысль , что если бы я добавлял теги, такие как:

<img src="myimage.png"> 

..., тогда мой файл просто должен был находиться в том же каталоге, что и приложение java, когда я побежал. Но я пробежался по разным вещам и перепробовал подкаталоги, и он не может найти мой локальный образ. (Он находит их просто отлично от сети с "http://etcetcetc").

Вся документация, которую я ищу для этих вещей, в основном говорит о каталоге "ваш html файл находится", и, конечно, у меня "действительно" нет файла html, только виртуальный ,

Есть ли способ спросить его, из какого каталога, по его мнению, он читает?

Я попытался поместить файл в каталог, который возник в результате:

System.getProperty("user.dir");

... но без радости.

Ищите здесь какой-то относительный путь, чтобы можно было отображать файлы изображений, установленные на компьютере пользователя вместе с приложением.

[РЕДАКТИРОВАТЬ: упс, исправил мой HTML пример]

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Хорошо, я обнаружил (из лакомых кусочков, полученных в нескольких тангенциально связанных ответах на другие вопросы), что мне нужно было создать элемент URL, а затем заполнить его с помощью ClassLoader или аналогичного метода.

Например, один человек получил свою вещь:

String filename = getClass().getClassLoader().getResource("res/Kappa.png").toString();
String preTag="filename is : "+filename+"
"; String imageTag =" "; kit.insert HTML (do c, do c .getLength (), preTag + imageTag, 0, 0, HTML .Tag.IMG);

Тем временем Исходя из этой подсказки, метод, который в итоге заставил мои вещи работать «лучше», был:

    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"), и я go анализирую их и заменяю их результатом запроса URL, если он будет успешным.

Если кто-то имеет более полный ответ на вопрос о Оригинальный вопрос (где вообще HTMLEditorKit искать местные ПУТИ? Что такое локальный путь по умолчанию? Как я могу сделать так, чтобы он выглядел в моем текущем рабочем каталоге, или в каталоге, из которого запущено приложение, или на самом деле что-нибудь локальное в этом роде? исчерпывающий ответ на оригинальный вопрос.

0 голосов
/ 20 апреля 2020

Есть ли способ спросить его, из какого каталога, по его мнению, он читает?

Не знаю, должен ли он находиться в том же каталоге (или подкаталоге), где находится файл класса, или он может находиться в любом каталоге, найденном в пути к классам.

В любом случае ваш HTML неверен:

<img="myimage.png"> 

Это должно быть:

<img src="myimage.png"> 

или изменить размер изображения

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

Читать раздел из учебника по Swing Использование текстовых компонентов . У TextSamplerDemo есть рабочий код, который отображает изображение.

...