2012-11-28 8 views
1

Я экспериментировал с java.awt.event.MouseEvent и кнопками мыши и клавишами-модификаторами. Наконец я подошел к делу, где меня смутило его поведение.Определите, нажата ли средняя кнопка мыши, но не клавиша alt

Обычно я использую SwingUtilities.isLeftMouseButton(...) и т. Д., Чтобы определить, какая кнопка мыши нажата, и <MouseEvent>.isControlDown() и т. Д., Чтобы определить, какая клавиша модификатора нажата.

Но если я нажимаю среднюю кнопку мыши, то метод <MouseEvent>.isAltDown() всегда верен, независимо от того, нажата ли клавиша Alt или нет (кстати, для правой кнопки мыши и мета-клавиши).

Кажется, что некоторые клавиши на клавиатуре разделяют те же флаги событий, что и некоторые кнопки мыши. How to fetch the middle mouse button in java? похоже подтвердите мое предположение.

Итак, мой вопрос: есть ли способ определить, какая кнопка мыши нажата и какие модификаторы действительно нажаты? Или лучше использовать только клавиши Ctrl и Shift для условных событий мыши?

ОС: Windows 8, Java версии "1.7.0_09"

Спасибо заранее

+0

Кстати, клавиша Alt имеет особый bevavior в UNIX-системах, поэтому его нельзя использовать без Ctrl или Shift в качестве ключа-модификатора. – FrecherxDachs

ответ

0

Что касается вашего вопроса средней кнопкой мыши ... http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6495530, казалось бы, что ВС/Oracle знает об этом выпуске с 2006 года ...

Для других случаев (как минимум простых) Я делаю следующее.

@Override 
public void mouseClicked(MouseEvent e) { 
    if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON2){ 
     //Do some stuff... 
     if (e.isControlDown()) { 
      //Do something if control is down 
     }else{ 
      //Something different if it is not down. 
     } 
    } 
} 

Существует аналогичный помощник для альта (который не работает с средней кнопкой, его всегда верно), сдвиг и мета (в том, что ключ OS X?).

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