JOGL, com.jogamp.newt.event.KeyListener проблемы
Итак, у нас есть структура приложения:
в конструкторе EC_GUI я инициализирую glViewer
private void initGlViewer() {
/**
* Viewer.
*/
glViewer = new GLViewer();
glViewer.setup();
centerPanel.add(glViewer.getNewtCanvasAWT());
}
GlViewer реализует GLEventListener и является следующим
public GLViewer() {
GLProfile gLProfile = GLProfile.getDefault();
GLCapabilities gLCapabilities = new GLCapabilities(gLProfile);
glWindow = GLWindow.create(gLCapabilities);
/*
* We combine NEWT GLWindow inside existing AWT application (the main JFrame)
* by encapsulating the glWindow inside a NewtCanvasAWT canvas.
*/
newtCanvasAWT = new NewtCanvasAWT(glWindow);
}
в glViewer.setup() я добавляю слушатели мыши, ключа и glEvent к glWindow.
Я использую событие мыши и ключа из com.jogamp.newt.event.
Мое событие keyPressed в keyListener начинается как:
@Override
public synchronized void keyPressed(KeyEvent ke) {
System.out.println("keyPressed " + ke.getKeyCode());
и ключ отпущен.
Ну, иногда я испытываю несоответствия относительно запуска. Давайте возьмем в качестве примера, когда я нажимаю комбинацию Ctrl+ O, чтобы открыть файл Chooser.
Это так и должно быть:
keyPressed 17
List of pressed inputs
ctrl
keyPressed 79
List of pressed inputs
ctrl
o
keyReleased 17
keyReleased 79
2014.10.09, 10:53:49 [INFORMATION] Open a project ...
2014.10.09, 10:53:49 [INFORMATION] Opening file chooser for load.
2014.10.09, 10:53:55 [INFORMATION] User clicked 'cancel' in file chooser dialog.
Здесь вы видите, что я нажимаю ctrl (17), затем o (17), они оба освобождаются, и отображается файл fileChooser. И тогда я выхожу, как вы можете видеть в последней строке.
Но иногда это то, что я получаю:
keyPressed 17
List of pressed inputs
ctrl
keyPressed 79
List of pressed inputs
ctrl
o
keyReleased 17
2014.10.09, 10:57:34 [INFORMATION] Open a project ...
2014.10.09, 10:57:34 [INFORMATION] Opening file chooser for load.
2014.10.09, 10:57:35 [INFORMATION] User clicked 'cancel' in file chooser dialog.
keyPressed 17
List of pressed inputs
ctrl
keyReleased 79
2014.10.09, 10:57:36 [INFORMATION] Open a project ...
2014.10.09, 10:57:36 [INFORMATION] Opening file chooser for load.
2014.10.09, 10:57:38 [INFORMATION] User clicked 'cancel' in file chooser dialog.
Я получаю ctrl и o keyPressed, но мне не хватает одного из keyReleased, o в этом случае. В любом случае fileChooser все еще открывается. В следующей попытке я снова нажимаю Ctrl+ O, но в этот раз я пропускаю клавишу o. Я также скучаю по клавише Ctrl. В любом случае fileChooser по-прежнему открыт. Но иногда он не открывается, например:
keyPressed 17
List of pressed inputs
ctrl
keyPressed 79
List of pressed inputs
ctrl
o
keyReleased 17
2014.10.09, 11:08:57 [INFORMATION] Open a project ...
2014.10.09, 11:08:57 [INFORMATION] Opening file chooser for load.
2014.10.09, 11:08:58 [INFORMATION] User clicked 'cancel' in file chooser dialog.
keyPressed 17
List of pressed inputs
ctrl
keyReleased 79
2014.10.09, 11:08:59 [INFORMATION] Open a project ...
2014.10.09, 11:08:59 [INFORMATION] Opening file chooser for load.
2014.10.09, 11:09:02 [INFORMATION] User clicked 'cancel' in file chooser dialog.
keyReleased 79
keyReleased 17
keyReleased 79
Я получаю ctrl-keyPressed, o-keyPressed, ctrl-keyReleased, нет o-keyReleased, fileChooser открывается, затем закрываю его. Я нажал их снова, я получаю ctrl-keyPressed, нет o-keyPressed, o-keyReleased, нет ctrl-keyReleased, fileChooser открывается, затем я закрываю его снова. Я снова нажимаю Ctrl+ O, я не получаю никаких нажатий клавиш, я просто получаю o-keyReleased, ctrl-keyReleased, а затем еще один o-keyReleased. FileChooser не открывается в этот раз..
Любая подсказка?
2 ответа
Я решил, проверяя при каждом событии keyPressed/keyReleased нажатые модификаторы, запрашивая каждый модификатор X с помощью KeyEvent.isXDown()
Альтернативное решение для этого находится в keyReleased(), также использующем
if (!ke.isAutoRepeat())
{
// ... do stuff
}
isAutoRepeat() отфильтровывает события ввода, автоматически отправленные ОС несколько раз.