Клавиши буферизации окна Java, пока пользователь не щелкнет мышью

Вот основная идея:

Существует окно Java (основное), которое открывает другое окно Java (дочерний). Когда дочерний элемент создан, часть инициализации устанавливает фокус в соответствующем текстовом поле в дочернем окне:

childTextField.requestFocusInWindow();
childTextField.setCaretPosition(0);

Дитя обычно открывается с помощью серьезных нажатий клавиш через интерфейс типа командной строки. Когда окно запрашивается в 90% времени, фокус правильно переходит к текстовому полю дочернего окна, и пользователь может ввести его в поле. Если команда на открытие дочернего элемента отправляется (нажатием клавиши ввода), и пользователь сразу начинает вводить текст перед созданием нового окна, текст корректно буферизуется и появляется в новом текстовом поле после открытия окна.

Однако время от времени, когда пользователь запрашивает открытие дочернего окна и затем начинает вводить текст, его текст НЕ появляется в текстовом поле. Только после того, как они щелкнут мышью в поле, текст, который они ввели, появляется. Как будто он где-то хранится и не выходит, пока не щелкнет.

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

Конечно, за кулисами происходят все виды других моджах, включая общение с серверным приложением, но я не уверен, что это связано.

Любые мысли или идеи будут очень цениться.

10.12.2008 17:50:08
4 ОТВЕТА
РЕШЕНИЕ

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

На самом деле, трудности с воспроизведением делают этот звук еще более вероятным.

Отладка этого случая потребует небольшой хитрости и хитрости. Если вы используете Solaris 10 или OS / X, я бы порекомендовал использовать dtrace; Вы можете легко поместить точку трассировки в очередь событий. В нет, вы можете захотеть иметь другой поток, который периодически отбрасывает что-то в очередь событий.

0
10.12.2008 17:56:24

Заблокированный поток очереди событий звучит ОЧЕНЬ вероятно. К сожалению, я нахожусь на окнах, так что никаких следов для меня, но я определенно собираюсь исследовать это более тщательно.

Конечно, всем, кто мог бы иметь другие идеи, был бы очень рад.

0
10.12.2008 18:04:29

У меня была проблема, похожая на эту. попробуйте добавить это после вашегоinit()

EventQueue.invokeLater(new Runnable() {
    public void run() {
        childtextfield.requestFocus();
        childTextField.setCaretPosition(0);
    }
});

Это сработало для меня.

1
8.02.2012 12:12:43

Оказывается, ответ не был таким уж интересным. После того, как вы упомянули очередь событий, я немного углубился в код. Оказывается, в приложении есть собственный менеджер фокусировки клавиатуры. Это будет делать такие вещи, как буферизация текста, набранного в ожидании открытия дочернего окна. В коде, открывающем дочернее окно, он вызывает функцию (через слушателя), которая очищает буфер и, таким образом, отображает его на экране. В те 10% или меньше времени этого не происходит. Однако та же самая функция сброса также прикреплена к щелчкам мыши, которые происходят внутри текстовых полей. Итак, как вы уже догадались, оно не вспыхнуло при открытии окна, а произошло при щелчке мышью.

Спасибо за помощь ... хотя решение было не совсем, оно определенно указало мне правильное направление. Теперь мне нужно выяснить, почему функция flush не всегда вызывается при открытии окна ...

0
10.12.2008 18:55:16
хорошо, что один почти наверняка является ошибкой. Я бы как можно раньше поместил точку трассировки или вызов logger.info или чего-то подобного в диспетчер фокуса, посмотрел, что на самом деле происходит, и прошел бы по путям кода. Скорее всего, есть непредвиденный случай и путь к коду, который не сбрасывается.
Charlie Martin 14.12.2008 18:40:25