Как отладить обработку ActionEvent JComboBox в Eclipse и избежать блокировки оконной системы?

#eclipse #debugging #swing #kde

#eclipse #отладка #swing #kde-plasma

Вопрос:

Я написал плагин Eclipse, который имеет графический интерфейс Swing. Для отладки плагина я создаю дополнительное рабочее пространство Eclipse. Затем я устанавливаю точку останова для метода, который вызывается actionPerformed методом при выборе пункта меню из JComboBox.

Когда я выбираю элемент из JComboBox, мой графический интерфейс зависает с отображением всего меню JComboBox. Значок KDE, представляющий рабочее пространство отладки Eclipse, мигает, как обычно, при достижении точки останова. К сожалению, на данный момент мой сеанс KDE закрыт. Я могу перемещать мышь, но выбор любого окна или значка не имеет никакого эффекта (включая мигающий значок отладки Eclipse). Я ничего не могу сделать в KDE, поэтому я захожу в обычное окно терминала через и завершаю процесс eclipse. Это позволяет мне снова выполнять действия в KDE.

Что я могу сделать, чтобы избежать этой блокировки в KDE 4.5.5 и отладить свой код? Вот некоторые из соответствующих свойств Java и Eclipse:

 eclipse.buildId=M20100909-0800
eclipse.commands=-os
linux
-ws
gtk
-arch
x86
-showsplash
/am/embassy/vol/x6/eclipse/eclipse-jee-helios-SR1//plugins/org.eclipse.platform_3.6.1.v201009090800/splash.bmp
-launcher
/am/embassy/vol/x6/eclipse/eclipse-jee-helios-SR1/eclipse
-name
Eclipse
--launcher.library
/am/embassy/vol/x6/eclipse/eclipse-jee-helios-SR1//plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.1.1.R36x_v20100810/eclipse_1309.so
-startup
/am/embassy/vol/x6/eclipse/eclipse-jee-helios-SR1//plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
-product
org.eclipse.epp.package.jee.product
-clean
-debug
-vm
/usr/pkg/java/sun-6/bin/../lib/i386/client/libjvm.so
java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment
java.awt.printerjob=sun.print.PSPrinterJob
java.class.path=/am/embassy/vol/x6/eclipse/eclipse-jee-helios-SR1//plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
java.class.version=50.0
java.endorsed.dirs=/usr/pkg/java/sun-6/lib/endorsed
java.ext.dirs=/usr/pkg/java/sun-6/lib/ext:/usr/java/packages/lib/ext
java.home=/usr/pkg/java/sun-6
java.library.path=/usr/pkg/java/sun-6/lib/i386/client:/usr/pkg/java/sun-6/lib/i386:/usr/pkg/lib:::/usr/java/packages/lib/i386:/lib:/usr/lib
java.runtime.name=Java(TM) SE Runtime Environment
java.runtime.version=1.6.0_22-b04
java.specification.name=Java Platform API Specification
java.specification.vendor=Sun Microsystems Inc.
java.specification.version=1.6
java.vendor=Sun Microsystems Inc.
java.version=1.6.0_22
java.vm.info=mixed mode, sharing
java.vm.name=Java HotSpot(TM) Client VM
java.vm.specification.name=Java Virtual Machine Specification
java.vm.specification.vendor=Sun Microsystems Inc.
java.vm.specification.version=1.0
java.vm.vendor=Sun Microsystems Inc.
java.vm.version=17.1-b03
  

Ответ №1:

Как описано здесь:http://bugs.sun.com/view_bug.do?bug_id=6714678 обходным путем является отключение получения захватов на платформе X11 путем добавления: -Dsun.awt.disablegrab=true в аргументы виртуальной машины.

Комментарии:

1. Добавьте -Dsun.awt.disablegrab=true в аргументы виртуальной машины вашего проекта, а не в eclipse.ini

2. В дополнение к @Lordbalmon вы можете настроить это в: Проект — Свойства — Запустить настройки отладки — Выберите проект и нажмите редактировать — Вкладка Аргументы — Аргументы виртуальной машины — Скопируйте «-Dsun.awt.disablegrab= true». У меня это сработало, спасибо!!!

3. Возникает вопрос, почему это не используется по умолчанию при запуске в Linux … «получение захватов», что это вообще значит и каковы последствия этого? Ссылка не работает, новая здесь: bugs.java.com/bugdatabase/view_bug?bug_id=6714678

4. Чертовски раздражает, что, похоже, нет надлежащего исправления, это просто недостаток в дизайне X11? Интересно, исправлено ли это с помощью Wayland тогда… Я предполагаю, что это отчасти рассматривается здесь, если вы ищете аргумент: docs.oracle.com/en/java/javase/15/troubleshoot /…

Ответ №2:

Я забыл завершить обработку ActionEvent с помощью SwingUtilities.invokeLater() . Как только я это сделал, моя проблема была решена.

Комментарии:

1. Это всего лишь обходной путь для ошибки, о которой упоминал Деннис.