右键单击按钮 / Scala

8

我目前正在尝试使用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”。 我遇到的问题是,当我点击标签而不是按钮时,此代码会打印“鼠标单击于”+ e.point +“类型”+ 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)
  }
}

1
你正在使用哪个图形工具包/库?假定使用Swing,那么你的谷歌搜索能力有待提高:https://dev59.com/b1nUa4cB1Zd3GeqPdb-q 和 https://dev59.com/o1DTa4cB1Zd3GeqPJG9G - The Archetypal Paul
1
谢谢您的回答。在发布问题之前,我已经看过这两个问题,但是我不明白它们是如何工作的。非常抱歉我的问题没有表述清楚(我确实在使用swing)。我已经编辑了问题。 - Schnipp
那么,有什么能正常工作或不能正常工作的?你遇到了什么错误?正在发生什么事情,你原本期望的是什么? - The Archetypal Paul
我想知道用户是否右键单击了一个按钮。我不知道如何在注释中添加一些代码,所以我编辑了我的问题。 - Schnipp
3个回答

2
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”标志,但是您必须确保监视MousePressedMouseReleased两者,因为此标志取决于平台。

0

我认为你走在了正确的道路上,就我对Scala Swings的理解来看,问题可能出在没有正确地附加监听器上。首先,我会将按钮分配给一个值,并仅在其上调用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)
  }
}

我很想奖励这个赏金,但我需要代码能够在Scala中实际编译(最好是2.11)。我遇到了以下错误:object MouseEvent is not a member of package scala.swing.event Note: class MouseEvent exists, but it has no companion object. value getButton is not a member of javax.swing.AbstractButton - Walrus the Cat
原因是我所提到的MouseEvent来自java.awt。我已经更新了我的代码示例,请告诉我是否编译通过。 - Aldo Stracquadanio
谢谢 - 仍然出现“value getButton is not a member of javax.swing.AbstractButton”错误。 - Walrus the Cat
显然,“ButtonClicked”扩展了“ActionEvent”,而“MouseEvent”扩展了“InputEvent”。你有什么想法? - Walrus the Cat
好的,我又犯了一个错误,我进行了编辑,不知道是否有任何方法可以使用事件中的“Modifiers”而不是求助于awt peer,但我找不到任何方法。 - Aldo Stracquadanio
显示剩余2条评论

0

以下方法适用于我:

new Button {
   listenTo(mouse.clicks)
   reactions += {
     case MouseClicked(_, _, c, _, _) => handleClick(c == 0)
   }
}

def handleClick(isLeftClick: Boolean): Unit = {
   //
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接