Swing 右键单击按钮/Scala

Swing 右键单击按钮/Scala,swing,scala,button,right-click,Swing,Scala,Button,Right Click,我目前正试图用scala编写一个扫雷舰的代码,但我找不到方法来听右键点击按钮 我已经在网上搜索过了,但是我肯定找不到 如果有人能帮我,我将非常感激:) 谢谢 施尼普 (注意:Scala对我来说是一种新语言,我不是Java用户,所以如果我的问题听起来很愚蠢,我很抱歉) 编辑: 我试图找到(或实现)一个“ButtonClickedRight”函数,它可以听到右键单击按钮的声音 像这样 import scala.swing._ import scala._ import scala.swing.eve

我目前正试图用scala编写一个扫雷舰的代码,但我找不到方法来听右键点击按钮

我已经在网上搜索过了,但是我肯定找不到

如果有人能帮我,我将非常感激:)

谢谢

施尼普

(注意: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)
  }
}

我认为您走的是正确的道路,就我对scala摆动的理解而言,我认为问题在于您没有正确地连接侦听器。首先,我会将按钮指定给一个值,并仅对其调用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)
  }
}

按钮事件通过特定发布者
鼠标触发。单击

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
MouseRelease
,因为此标志取决于平台。

以下内容适用于我:

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

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

您正在使用哪个图形工具包/库?假设Swing,您的google fu很弱:谢谢您的回答。我在发帖之前看到过这两个问题,但我不明白它是如何工作的。很抱歉,我的问题不够清楚(我确实在使用swing)。我已经编辑了这个问题。那么,什么有效还是无效?你犯了什么错误?发生了什么?您期望什么?我想知道用户是否右键单击了按钮。我不知道如何在注释中添加一些代码,所以我编辑了我的问题。我很想奖励这个奖励,但我需要这些代码在Scala中实际编译(最好是2.11)。我收到以下错误:
object MouseEvent不是包scala.swing.event的成员注意:存在类MouseEvent,但它没有伴随对象。value getButton不是javax.swing.AbstractButton的成员,原因是我指的
MouseEvent
来自
java.awt
。我更新了我的代码示例,如果两者都不编译,请告诉我。谢谢——仍然获取
value的getButton不是javax.swing.AbstractButton的成员,显然
ButtonClicked
扩展
ActionEvent
,而
MouseeEvent
扩展
InputEvent
。想法?是的,我犯了另一个错误,我编辑了它,我想知道是否有任何方法可以使用事件中的
修饰符,而不是求助于awt同行,但我找不到任何方法。