Правый клик по кнопке / 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 = {
   //
}
Другие вопросы по тегам