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