Правый клик по кнопке / Scala
В настоящее время я пытаюсь кодировать тральщик, используя scala, но я не могу найти способ прослушивания щелчка правой кнопкой мыши по кнопке.
Я уже искал в Интернете способ сделать это, но я определенно не смог его найти.
Если бы кто-нибудь мог мне помочь, я был бы очень благодарен:)
Спасибо,
Schnipp
(Примечание: Scala - новый язык для меня, и я не пользователь Java, поэтому мне жаль, если мои вопросы звучат глупо)
РЕДАКТИРОВАТЬ:
Я пытаюсь найти (или реализовать) функцию ButtonClickedRight, которая может прослушивать щелчок правой кнопкой мыши по кнопке.
как это
import scala.swing._
import scala._
import scala.swing.event._
object Right extends MainFrame with App {
title = ""
visible = true
val b = new button("")
listenTo(b)
reactions += {
case ButtonClicked(`b`) => *code*
case ButtonClickedRight(`b`) => *code*
}
}
РЕДАКТИРОВАТЬ 2 -
Я хотел бы знать, нажал ли пользователь на кнопку "1" или нет. Проблема, с которой я столкнулся, заключается в том, что этот код печатает "Mouse click at " + e.point+" type "+e.modifiers, когда я нажимаю на ярлык, но не на кнопку.
object App extends SimpleSwingApplication {
lazy val ui = new GridPanel(2,1) {
contents += new Button("1")
contents += new Label("2")
listenTo(mouse.clicks)
reactions += {
case e: MouseClicked =>
println("Mouse clicked at " + e.point+" type "+e.modifiers)
}
}
def top = new MainFrame {
contents = ui
visible = true
preferredSize = new Dimension(500,500)
}
}
2 ответа
События кнопки запускаются через определенного издателя .mouse.clicks
,
import scala.swing._
import scala.swing.event._
object App extends SimpleSwingApplication {
lazy val ui = new GridPanel(2,1) {
val button = new Button("1")
contents += button
contents += new Label("2")
listenTo(button.mouse.clicks) // !
reactions += {
case evt @ MouseClicked(`button`, pt, _, _, _) =>
val which = evt.peer.getButton
if (which > 1) {
println(s"Mouse clicked at (${pt.x}; ${pt.y}) - button: $which")
}
}
}
lazy val top = new MainFrame {
contents = ui
size = new Dimension(500,500)
}
}
Обратите внимание, что по крайней мере в Linux моя правая кнопка имеет номер 3, а не 2. Вы также можете использовать triggersPopup
флаг, но тогда вы должны убедиться, что контролировать оба MousePressed
а также MouseReleased
, поскольку этот флаг зависит от платформы.
Я думаю, что вы на правильном пути, поскольку я понимаю колебания скалы, я думаю, что проблема в том, что вы неправильно подключаете слушателя. Для одного я назначил бы кнопке значение и вызвал listenTo только для него:
val button = new Button("1")
listenTo(button)
Затем, в реакциях, я написал бы проверку шаблона в случае, если он исходит от кнопки (вероятно, избыточный, если вы вызываете только listenTo
прохождение кнопки) и чтобы она имела правильную кнопку:
case ButtonClicked(b) if b == button && b.peer.getButton == MouseEvent.BUTTON_2 => ...
Таким образом, код, который вы указали при редактировании, станет:
object App extends SimpleSwingApplication {
lazy val ui = new GridPanel(2,1) {
val button = new Button("1")
contents += button
contents += new Label("2")
listenTo(button)
reactions += {
case evt @ MouseClicked(b, pt, _, _, _) if b == button && evt.peer.getButton == java.awt.event.MouseEvent.BUTTON2 =>
println(s"Mouse clicked at (${pt.x}; ${pt.y}) - button: ${evt.peer.getButton}")
}
}
def top = new MainFrame {
contents = ui
visible = true
preferredSize = new Dimension(500,500)
}
}
Для меня работает следующее:
new Button {
listenTo(mouse.clicks)
reactions += {
case MouseClicked(_, _, c, _, _) => handleClick(c == 0)
}
}
def handleClick(isLeftClick: Boolean): Unit = {
//
}