Удивительно, что никто из них никогда не упоминал настройки сервера Apache
сервера (*.conf
) или .htaccess
как причину этой ошибки. Найдите в файлах конфигурации .htaccess
или Apache
, чтобы убедиться, что у вас нет следующего набора DENY
:
Header always set X-Frame-Options DENY
Смените его на SAMEORIGIN
, делает работу так, как ожидалось:
Header always set X-Frame-Options SAMEORIGIN
Вам нужно использовать invokeLater
только когда вы хотите обновить UI из другого потока, который не является потоком UI (поток диспетчеризации событий).
Предположим, у вас есть обработчик нажатия кнопки, и вы хотите изменить текст метки, когда кто-то нажимает на кнопку. Тогда вполне можно установить текст метки напрямую. Это возможно, потому что обработчик события нажатия кнопки выполняется в потоке UI.
Предположим, однако, что при очередном нажатии на кнопку вы запускаете другой поток, который выполняет некоторую работу, и после завершения этой работы вы хотите обновить пользовательский интерфейс. Тогда вы используете invokeLater
. Этот метод гарантирует, что обновление пользовательского интерфейса будет выполнено в потоке пользовательского интерфейса.
Поэтому во многих случаях вам не нужен invokeLater
, вы можете просто выполнять обновление UI напрямую. Если вы не уверены, вы можете использовать isDispatchThread
, чтобы проверить, выполняется ли ваш текущий код в потоке диспетчеризации событий.
Вам нужно сделать это, только если вы не уже в потоке отправки событий. Если вы не запустили новые потоки или не выполнили код из основного потока, весь ваш код, вероятно, уже выполняется из потока отправки событий, что делает это ненужным. Например, все обработчики событий пользовательского интерфейса вызываются в потоке отправки событий, поэтому вам не нужно делать это для кода, вызываемого оттуда.