Как избежать HeadlessException в потоке? - PullRequest
1 голос
/ 26 июля 2010

Я попытался открыть диалоговое окно в сервлете, и оно открывается нормально.Но затем я попытался добиться того же в методе запуска моего потока.Это дало мне следующую ошибку:

java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.<init>(Window.java:431)
at java.awt.Frame.<init>(Frame.java:403)

Ниже мой код:

JFrame frame = new JFrame("Success Message");
frame.setSize(200, 50);
frame.add(new JLabel("Data uploaded from "+inputFile.getFilename()));
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Я также пробовал код ниже, но не удалось

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
System.out.println("Headless mode: " + ge.isHeadless());
if(!ge.isHeadless()){ 
    System.setProperty("java.awt.headless", "true");
}

Исключение описывается как: Генерируется, когда код, зависящий от клавиатуры, дисплея или мыши, вызывается в среде, которая не поддерживает клавиатуру, дисплей или мышь.

Ответы [ 2 ]

3 голосов
/ 26 июля 2010

Существует код, который в конечном итоге должен касаться видеокарты или, по крайней мере, работающей графической подсистемы в Java. Если вы запустите этот код в системе, в которой не включена графика, вы получите исключение HeadlessException.

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

На вашем веб-сервере вы просите генератор веб-страниц (сервлет) открыть диалоговое окно. Это создает проблемы по ряду причин:

  1. Диалоговое окно будет отображаться на веб-сервере, а не на веб-клиенте.
  2. Веб-сервер имеет только один экран, и диалоговые окна будут отображаться в соответствии с людьми, просматривающими веб-страницу.
  3. Поскольку сервер потенциально может обрабатывать множество клиентов одновременно, сервер настроен на использование минимального количества ресурсов для каждого клиента.
  4. Поскольку сервер возвращает элементы только в веб-браузеры, ему не нужна графическая среда.

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

Как правило, вы не можете смешивать свинг / awt-код с сервлетами; однако существует подмножество графических операций, доступных как в размахе, так и в awt, которые позволяют манипулировать изображениями без необходимости в графической среде. Это должно облегчить разработку преобразования и построения изображений в среде обработки файлов, где изображения никогда не будут отображаться программой. Рассмотрим в качестве примера конвертер .png в .jpg, если он никогда не показывает изображение, программа может открывать изображения (и) и выполнять работу, а также закрывать изображения без использования видеокарты.

1 голос
/ 26 июля 2010

Код Java-сервлета выполняется на веб-сервере, а не на веб-клиенте (веб-браузере).Все, что делает веб-сервер - это прослушивает HTTP-запросы, генерирует ответы HTML / CSS / JS и отправляет их веб-клиенту.Все, что делает веб-клиент, - отправляет HTTP-запросы и обрабатывает полученные ответы HTML / CSS / JS.

Если вы запустите Swing GUI в сервлете, он будет отображаться на веб-сервере, а не на веб-клиенте.

Существует три основных решения этой конкретной проблемы:

  1. Вместо этого запустите код графического интерфейса Swing на веб-клиенте.Вы можете сделать это в духе апплета или веб-старта , обслуживаемого страницей JSP / HTML.

  2. Использовать клиентскую сторонувместо этого язык программирования / сценариев, например, JavaScript или ActionScript (Flash).В JavaScript есть функция alert(), которая отображает диалоговое окно.

  3. Используйте теги типа JSTL <c:if> и / или EL в JSP для условной визуализации содержимого HTML / CSS / JS.В конечном итоге может быть объединен с решением № 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...