Swing JFrame, отвечающий на собственное окно при закрытии события - PullRequest
1 голос
/ 30 октября 2010

У меня есть приложение Swing, которое состоит из одного JFrame, установленного на Always On Top.

При работе в Windows я использую следующий код для открытия собственного почтового клиента и браузера по умолчанию соответственно:

Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + Utils.formatMailtoUrl(to, subject, body));
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);

Поскольку JFrame установлен на Always On Top, в то время как типичный браузер или почтовый клиент по умолчанию (IE и Outlook для нашего клиента) не открываются как Always On Top, первый препятствует последнему.

Наше текущее «решение» заключается в минимизации JFrame при одновременном открытии собственных окон.Но это оказывается проблемой соответствия 508, и нас просят:

  1. Не минимизировать JFrame.
  2. Вернуть фокус в JFrame после браузера или почтового клиентазакрыты

Стратегия, которую я имею в виду, состоит в том, чтобы "отключить" состояние Always On Top JFrame и иметь какой-то обратный вызов или прослушиватель событий, который уведомит JFrame о том, что окна электронной почты или браузерабыли закрыты, а затем переключите JFrame обратно в состояние Always On Top и установите фокус.

Поскольку это приложение Java, я боюсь, что это почти невозможно, потому что мы говорим о нативном взаимодействии.Является ли моя стратегия выполнимой, есть ли лучшая выполнимая стратегия, и, самое главное, как это можно сделать?!

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 30 октября 2010

Я не уверен, есть ли собственный способ сделать это, но вы можете запустить tasklist.exe или скрипт vb, записать результаты и оттуда определить, работает ли Outlook или IExplore. Это потребует, чтобы вы выполняли проверку через некоторый разумный интервал вместо ожидания события.

Process p = Runtime.getRuntime().exec("tasklist.exe /FO CSV /FI eq outlook.exe");
BufferedReader input = new BufferedReader (new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
    look for a line containing outlook.exe
}
input.close();

Вам придется проверять outlook.exe и iexplorer.exe отдельно, так как я не думаю, что вы можете отфильтровать список задач по этому ИЛИ.

Я уверен, что это можно обобщить, чтобы искать то, что открывается вашим исходным вызовом.

Редактировать: Теперь, когда я написал все это, мне приходит в голову, что ваш исходный вызов возвращает процесс, который можно использовать. Так что попробуйте что-нибудь, запустите новый поток, откройте почтовую программу по умолчанию или браузер в этом потоке, удалите условие «всегда сверху» и вызовите waitfor для возвращаемого процесса. После этого вызова установите условие «всегда сверху». Этот поток будет ожидать завершения процесса, не блокируя графический интерфейс или другие функции программы.

0 голосов
/ 08 ноября 2010

У меня есть некоторый успех со следующим:

  1. Когда запускается действие по открытию браузера (например), отключите настройку JFrame Always On Top.
  2. Включите действие фокусировки на окне, которое включает настройку JFrame Always On Top.
  3. Если пользователь не перемещается ни к каким другим окнам, кроме браузера, то, когда браузер закрывается, JFrame автоматически восстанавливает фокус и, таким образом, возвращается в состояние Always On Top

У этого подхода есть два недостатка. Во-первых, пользователь может вручную вернуться к окну JFrame, прежде чем закрыть окно браузера, в результате чего JFrame восстановит фокус и застрянет в режиме Always On Top. Но это может быть приемлемым. Вторая проблема заключается в том, что программа чтения с экрана JAWS версии 9 сходит с ума и перечитывает последний выделенный компонент как минимум 3 раза, как только JFrame восстанавливает фокус.

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