Ошибка перетаскивания файла из OSX Finder в JTable в Java 11 - PullRequest
0 голосов
/ 09 апреля 2020

Недавно мы обновили наше приложение до уровня Java 11 (раньше Java 8). На главном экране наших приложений есть одна панель, на которую можно перетаскивать файлы. Это прекрасно работает на Windows, но не на OSX. (раньше работал в Java 8, сбой после переключения на Java 11).

Файл можно перетащить из другого приложения Java, которое его поддерживает, но НЕ из Finder. Метод TransferHandler.canImport () никогда не вызывается.

Метод DropTarget.dragOver () вызывается, но метод drop () никогда не вызывается. Я не могу отследить методы библиотеки времени выполнения, поскольку в ней нет информации о номере строки.

Я обнаружил, что МОГУТ перетаскивать файлы из Finder в другое приложение Java или в JDialog в нашем основное приложение. Сбой только в том случае, если JTable находится на панели в нашем главном окне приложения. Поэтому наше приложение должно делать что-то странное, чтобы оно не сработало.

Проблема в том, чтобы выяснить, ПОЧЕМУ оно не работает, только на OSX. Это большое приложение, и главное окно довольно сложное. Опубликовать пример автономного источника невозможно - тем более что простой случай работает.

Что я мог бы ДЕЙСТВИТЕЛЬНО использовать, так это библиотеку времени выполнения Java 11, в которой есть информация о номере строки, так что я могу вступить в нее. Да, у меня есть полный источник, поставляемый с Java 11 JDK. (Примите OpenJDK) Мне не удалось заставить его скомпилироваться в Eclipse.

Есть какие-нибудь предложения о том, что может делать наше приложение, чтобы это не получилось? Или где я могу найти библиотеку времени выполнения Debug Java 11?

1 Ответ

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

Конечно, было бы неплохо иметь библиотеку времени выполнения Debug.

Проблема заключается в том, что при вызовах DropTarget.dragEnter () и .dragOver () данные в Transferable и getCurrentDataFlavors () недействительно на OSX. getCurrentDataFlavors () вернет список ВСЕХ вариантов данных - ни один из которых не будет иметь TransferData. (это означает, что данные также недопустимы во всех вызовах TransferHandler.canImport ().)

ЕДИНСТВЕННОЕ время, когда данные действительны, находится в вызове TransferHandler.importData ().

Наш код проверял, что пользователь перетаскивает файл правильного типа в вызове canImport (). Поскольку все данные теперь недопустимы (OSX, Java 11), этот вызов вызывал NPE (так как getCurrentDataFlavors () включал наш желаемый вкус, но getTransferData (flavour) возвращает ноль. Обратите внимание, что это работает правильно с Java 8.

Объедините это с кодом обработки перетаскивания во время выполнения, который автоматически игнорирует исключения, ну, не совсем игнорирует их, отключает все дальнейшие операции удаления для этой цели, когда это происходит. Это действительно затрудняет отслеживание того, что происходит.

...