Проблема JEditorPane с асинхронной загрузкой изображений

Я пытаюсь создать простое приложение Swing, которое содержит несколько JEditorPanes внутри. Каждый JEditorPane содержит текст с тегами html внутри. А также некоторые панели содержат html с тегами <img src='http://some.url' />, это означает, что изображения могут быть где-то в сети. И проблема в том, что если один из URL-адресов изображения недоступен - все мои JEditorPanes и все приложение зависают. (Я создаю JEditorPanes в собственном потоке и после построения помещаю их в основной фрейм, используя SwingUtilities.invokeLater(...) )

Я считаю, что изображения загружаются в JEditorPanes асинхронно, есть ли возможность убить эти зависшие потоки загрузки изображений?

Или, может быть, есть лучшее решение?

Спасибо

P.S. Используется SwingWorker. Проблема в том, что если какой-либо URL-адрес изображения недоступен, все JEditorPanes не могут загрузить свои изображения. На самом деле они не зависают, но не могут загрузить изображения. Почему?

P.P.S.

Фоновая цепочка:

    JEditorPane jtp=new JEditorPane();
    jtp.setContentType("text/html");
    jtp.setPreferredSize(newDimension(20,250));                     
    StringBuilder sb=new StringBuilder();
    sb.append("<img src='").append(url).append("'/>");
    jtp.setText(sb.toString());

    SwingUtilities.invokeLater(new Runnable(){
    @Override
    public void run() {                             
       myPanel.add(rigid,0);        
       myPanel.add(jtp,0);

       myPanel.revalidate();
      }
    });

person stemm    schedule 05.08.2011    source источник


Ответы (2)


рассмотрите возможность использования SwingWorker с пример или возможен запуск фоновой задачи из Runnable#Thread (вывод должен быть завернут в invokeLater()

person mKorbel    schedule 05.08.2011
comment
Спасибо. Но я их использую. Проблема в том, что если какой-либо URL-адрес изображения недоступен, все JEditorPanes не могут загрузить свои изображения. Почему? - person stemm; 05.08.2011
comment
@stemm действительно вам нужно опубликовать исполняемый код, который показывает ваш issee (e), включая код, где проверен/проверен URL..., потому что SWingWorker довольно легко отменить - person mKorbel; 05.08.2011
comment
вы создаете новый объект снова и снова..., повторно используете JComponents, почему бы не использовать JLabel download.oracle.com/javase/tutorial/uiswing/components/ для изображения/ImageIcon download.oracle.com/javase/tutorial/uiswing/components/, почему это очень сложный способ, BTW для правильной перерисовки иногда требуется revalidate() + repaint() - person mKorbel; 05.08.2011
comment
Спасибо. На самом деле я описал лишь малую часть своего кода. Конечно, в JEditorPane есть не только картинки, но и других html-элементов хватает. И я тоже пользуюсь перекрашиванием, но как по мне это не очень принципиально в описанной ситуации. Итак, резюмируя: у меня нет взаимоблокировок, я загружаю html из Интернета, создаю JEditorPane и только после вызова всех конструкторов помещаю JEditorPane в GUI. Но JEditorPane пытается загрузить изображения в свой поток (!?) и зависает. Так есть ли возможность прервать этот поток? - person stemm; 05.08.2011
comment
Извините, я не понимаю. Хм... Хорошо, не могли бы вы объяснить, как JEditorPane загружает изображения с URL-адреса? (в тегах ‹img src=someURL/›). Загружает ли JEditorPane их асинхронно? (потому что в первую очередь - появляется текст, а изображения появляются позже) - person stemm; 06.08.2011
comment
что за тема (So is there any ability to interrupt that thread?) - person mKorbel; 06.08.2011
comment
@stemm Does JEditorPane downloads them asynchronously? не совсем так, но SwingWorker может это сделать, как было предложено (@Hovercraft Full Of Eels) посмотрите здесь многопоточность с SwingWorker stackoverflow.com/questions/6171414/ - person mKorbel; 06.08.2011
comment
Меня просто интересует внутренний механизм загрузки изображений в JEditorPane. Не о многопоточности (я так делаю). Но меня интересует - если JEditorPane в процессе парсинга html находит URL-адрес изображения - создает ли JEditorPane собственный поток для загрузки изображения и продолжает парсинг? Или JEditorPane приостанавливает синтаксический анализ и начинает загрузку изображения? - person stemm; 06.08.2011

Я согласен с mKorbel в том, что фоновый поток — это то, что нужно (1+ к его ответу), и что SwingWorker — один из способов сделать это. Если вам нужно, чтобы несколько фоновых потоков выполнялись одновременно, будьте осторожны при использовании SwingWorker, хотя недавно произошла ошибка, из-за которой все SwingWorkers использовали только один поток. В этом случае рассмотрите возможность использования Исполнителей/Фьючерсов.

person Hovercraft Full Of Eels    schedule 05.08.2011
comment
Вы делаете свинг-вызовы из фонового потока, что вас запутает. Прочтите: Параллелизм в Swing - person Hovercraft Full Of Eels; 05.08.2011