Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline gc  
#1 Оставлено : 29 марта 2011 г. 20:28:11(UTC)
gc

Статус: Участник

Группы: Участники
Зарегистрирован: 02.02.2011(UTC)
Сообщений: 10
Откуда: Москва

В текущей реализации JCP окошко графического ДСЧ наследует JFrame, а это значит, что когда приложение вызывает генерацию ключа из модального окна-наследника JDialog, окно ДСЧ появляется под модальным окном и фокус не полуает. Кроме того, похоже ДСЧ иногда некорректно работает с EDT - валится EDT Rule violation exception. Нельзя ли использовать для него модальный диалог (JDialog), или же предусмотреть возможность подключить собственную реализацию подобного окна?
Offline Iva  
#2 Оставлено : 30 марта 2011 г. 16:02:42(UTC)
Iva

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.10.2008(UTC)
Сообщений: 181

Подключить собственную реализацию это маловероятно. Давно уже была попытка показать это окно и разрешить его вставлять. Очень скоро появился желающий "накормить" это окно сообщениями, чтоб пользователю не надо было ничего нажимать. Лазейку сразу прикрыли. Наличие биологической случайности важно при генерации пользовательского ключа, делать тут дыру не хочется.
Менять на JDialog сейчас значит потерять совместимость с теми, кто уже встроился и использует окно с JFrame. Думаете не появятся предложения вернуть все назад? Надо придумать возможность мирного сосуществования.
Создание пользовательского ключа весьма редкая операция. Может можно обойтись простым вариантом?
Offline gc  
#3 Оставлено : 1 апреля 2011 г. 18:16:46(UTC)
gc

Статус: Участник

Группы: Участники
Зарегистрирован: 02.02.2011(UTC)
Сообщений: 10
Откуда: Москва

Нас устроит вариант, аналогичный решению с look&feel: сделайте, чтобы, например, при выставлении System.setProperty("ru.CryptoPro.JCP.ControlPane.useJDialog","true") использовался JDialog. Если же параметр не выставлен, будет работать старый вариант с JFrame.
Offline gc  
#4 Оставлено : 5 апреля 2011 г. 18:11:08(UTC)
gc

Статус: Участник

Группы: Участники
Зарегистрирован: 02.02.2011(UTC)
Сообщений: 10
Откуда: Москва

Можно надеяться, что подобная возможность появится в ближайших версиях?
Offline Iva  
#5 Оставлено : 6 апреля 2011 г. 20:04:24(UTC)
Iva

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.10.2008(UTC)
Сообщений: 181

Не знаю. Простая замена на JDialog не работает, я попробовал, виснет. Если потребуется значительная переделка схемы, то нужен будет анализ какой-то, отсутствие негативного влияния и прочее.
Offline gc  
#6 Оставлено : 8 апреля 2011 г. 21:45:57(UTC)
gc

Статус: Участник

Группы: Участники
Зарегистрирован: 02.02.2011(UTC)
Сообщений: 10
Откуда: Москва

Вешается, видимо, из-за неправильной работой со свинговой нитью. Насколько я знаю, обычно делается так:

Если вызов функции (например, генерации ключа) происходит из свинговой нити (SwingUtilities.isEventDispatchThread()==true), напирмер, если вызов происходит напрямую из обработчика кнопки на форме, тогда можно смело брать JDialog, вызывать его show который будет блокировать нить заставляя пользователя делать ввод в диалог, при этом проблем с прорисовкой тоже не будет, так как модальный show будет нормально пропускать все события не касающиеся пользовательского ввода соответствующим компонентам.


Если же вызов делается не из свинговой нити (SwingUtilities.isEventDispatchThread()==false), тогда при необходимости получить пользовательский ввод, в очередь свинговых событий нужно поставить вызов своего диалога и дальше ждать пока диалог не отработает. Примерно так:

Код:

final Object lock = new Object();

synchronized (lock) {
  EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        final JDialog dialog = new JDialog((Frame) null, null, true);

        dialog.setVisible(true); // Блокируется до тех пор пока диалог не будет закрыт

        synchronized (lock) {
           lock.notify();
        }
      }
  });
  lock.wait();
}

// Сюда попадаем только после того как пользовательский диалог будет так или иначе закрыт
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.