Приложение Java WebStart, над которым я работаю, использует SWT для графического интерфейса, и недавно я обнаружил небольшую, но раздражающую проблему. Когда я выбираю действие, которое использует FileDialog
, т. Е. Сохраняет изображение, пользовательский интерфейс останавливается сразу после закрытия диалога.
Изображение сохраняется, и его можно без проблем открыть с помощью программы просмотра изображений по умолчанию, но с тех пор приложение перестает отвечать на запросы, и я вынужден убить приложение.
Я заметил, что результат тот же, когда я пытаюсь открыть файл с помощью FileDialog
, если я вместо этого открываю тот же файл, отправив его в качестве аргумента с помощью файла jnlp, он работает нормально, поэтому я не Не думаю, что это проблема с локальной файловой системой.
Я попытался воспроизвести проблему на Windows, чтобы убедиться, что она хорошо работает на Win 7. В качестве второй попытки устранения неполадок я попытался сохранить изображение из локальной версии приложения (другими словами, не JWS) и это тоже хорошо работает ...
Я подозревал проблему с правами доступа к файлу jnlp, но все права даны приложению, и подписи тоже все в порядке (факт, что приложение запускается, указывает на это). Кроме того, файл изображения пишется в любом случае, поэтому он не может быть разрешением.
Есть идеи?
ОБНОВЛЕНИЕ: Похоже, что здесь проблема не только в FileDialog, но и в любом виде графического взаимодействия с пользователем. Всякий раз, когда окна SWT развернуты, программа зависает с серым экраном, ПОСЛЕ любого действия, которое должно было быть сделано. Я скопировал некоторый код ниже, в этом конкретном примере, даже если я нажму «Отмена», приложение перестает отвечать на запросы с серым экраном. Вот пример кода:
public static boolean saveChangesBeforeDiscard(MyMain main)
{
if (main.isDirty())
{
MessageBox messageBox = new MessageBox(
main.getShell(),
SWT.ICON_WARNING | SWT.YES | SWT.NO | SWT.CANCEL);
messageBox.setMessage("Would you like to save the changes?");
messageBox.setText(MyMain.TOOL_NAME);
int answer = messageBox.open();
if (answer == SWT.YES)
{
SaveFileAction save = new SaveFileAction(main);
save.run();
return save.isSaved();
}
else if (answer == SWT.NO)
{
return true;
}
return false;
}
return true;
}
Обновление 2: Кстати, я использую Sun JDK 1.6.0. Вот вывод команды java -version:
Java-версия "1.6.0_22"
Java (TM) SE Runtime Environment (сборка 1.6.0_22-b04)
Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 17.1-b03, смешанный режим)