#java #swing #mouse #mouseevent
#java #swing #мышь #mouseevent
Вопрос:
Вопрос довольно прост. Я не смог найти много ссылок, касающихся этой проблемы, и те, которые я нашел, похоже, не избегали реального вопроса. Мое приложение должно обрабатывать события нажатия / отпускания мыши для кнопок мыши назад и вперед. Как я могу справиться с этим?
РЕДАКТИРОВАТЬ: это использует JDK 1.6.
Комментарии:
1. Что такое кнопки назад и вперед? У моей мыши только 1 кнопка 😉
2. @michael667: надо было купить компьютер 😉
Ответ №1:
Проверьте, обнаружены ли дополнительные кнопки мыши при вызове:
MouseInfo.getNumberOfButtons();
Проверьте, запускаются ли MouseEvents при нажатии этих дополнительных кнопок. Если да, то что MouseInfo.getButton()
возвращается?
Согласно javadocs для MouseInfo.getButton():
Если установлена мышь с пятью кнопками, этот метод может возвращать следующие значения:
* 0 (NOBUTTON) * 1 (BUTTON1) * 2 (BUTTON2) * 3 (BUTTON3) * 4 * 5
Комментарии:
1. 1: я не знал, что происходит с мышью с 5 кнопками. Но, @dogbane, как мы можем различать кнопки «назад» и «вперед»? Можем ли мы быть уверены, что кнопка 4 находится назад, а 5 — вперед?
2. Это работает только с Java 7 и выше. Java 6 и ниже никогда не возвращает 4 или 5 из
MouseInfo.getButton()
для любой мыши.3. В JDK 1.6
MouseEvent
конструктор выдает исключение, если кнопка больше 3.Toolkit.areExtraMouseButtonsEnabled
Метод был добавлен в 1.7.4. У меня проблема с
MouseInfo.getNumberOfButtons()
; он возвращает 5, но моя мышь имеет только три кнопки (включая кнопку колеса)
Ответ №2:
Взгляните на MouseEvent.getButton() и Toolkit.areExtraMouseButtonsEnabled() .
Комментарии:
1. К сожалению, я ограничен JDK 1.6, и этот
Toolkit
метод был добавлен в 1.7.
Ответ №3:
Заслуга принадлежит первоначальным респондентам, просто добавив готовый к использованию пример кода для глобального обнаружения кнопок назад / вперед на случай, если это поможет кому-либо еще (JDK 1.8)
if (Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled() amp;amp; MouseInfo.getNumberOfButtons() > 3) {
Toolkit.getDefaultToolkit().addAWTEventListener(event -> {
if (event instanceof MouseEvent) {
MouseEvent mouseEvent = (MouseEvent) event;
if (mouseEvent.getID() == MouseEvent.MOUSE_RELEASED amp;amp; mouseEvent.getButton() > 3) {
if (mouseEvent.getButton() == 4) {
// back
} else if (mouseEvent.getButton() == 5) {
// forward
}
}
}
}, AWTEvent.MOUSE_EVENT_MASK);
}
Комментарии:
1. Кнопки 4 и 5 для меня являются колесом мыши влево и вправо. Есть ли какой-либо способ определить, какой идентификатор кнопки принадлежит какой кнопке?
Ответ №4:
как мы можем различать кнопки «назад» и «вперед»? Можем ли мы быть уверены, что кнопка 4 находится назад, а 5 — вперед?
Я не использую JDK7 и никогда не слышал о кнопках назад / вперед. Однако я знаю, что у SwingUtilities
класса есть методы:
isRightMouseButton(MouseEvent)
isLeftMouseButton(MouseEvent)
isMiddleMouseButton(MouseEvent)
Если теперь поддерживаются back / forward, я бы предположил, что они добавили:
isBackMouseButton(MouseEvent)
isForwardMouseButton(MouseEvent)
Комментарии:
1. -1 за то, что даже не посмотрел, существуют ли эти методы (их нет, поэтому это даже не отвечает на вопрос, могу ли я использовать JDK 7). Кнопки назад / вперед — это просто боковые кнопки мыши. Не уверен, как вы об этом не слышали — они были на каждой мыши, которую я купил, по крайней мере, за последнее десятилетие.
2. @280Z28 Какую часть фразы «Я не использую JDK7» вы не понимаете? Как я могу прочитать API, если у меня нет к нему доступа? Я пытался быть полезным, чтобы указать людям на то место, где, по моему мнению, было бы логично добавить эту поддержку в JDK7. Вы никогда не должны жестко кодировать магические числа, поэтому вы должны использовать SwingUtilities, чтобы знать, какая кнопка была нажата. Мой комментарий о кнопках назад / вперед касался поддержки в Swing JDK6. Кроме того, вопрос, на который я ответил, на самом деле был задан AlexR. Не уверен, что лучший способ ответить, поскольку вы не можете опубликовать код в комментарии. Знал, что это не поможет вам в JDK6.
3. @camickr: Я не опускаю голоса назло людям. Любой объективный анализ вашего сообщения показывает, что он (вообще) не помогает тому, кто ищет ответ на мой вопрос. Любое разочарование в моем тоне связано с тем, насколько раздражает эта проблема, а не конкретно с вашим сообщением. Однако мне действительно нужен реальный ответ на мой вопрос, поэтому я больше придерживаюсь / -, чем мог бы быть в противном случае.
4. @280Z28 извините, что пытался помочь кому-то, кроме вас. Я выделил вопрос, на который пытался ответить. Как оказалось, мой мыслительный процесс был неправильным. Я все еще предполагаю, что реализация JDK7 является неполной. Если поддерживаются кнопки назад / вперед, вам не нужно использовать «магические числа», чтобы определить, какая кнопка использовалась. Любой, кто читал мой ответ объективно, знал бы, что это было предположение. Я был очень откровенен в том, что это предположение. Большинство людей прокомментировали бы, что SwingUtilities API по-прежнему не поддерживает эти значения.