右键单击Button / Scala

时间:2015-02-22 14:36:42

标签: swing scala button right-click

我目前正在尝试使用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)
  }
}

3 个答案:

答案 0 :(得分: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标志,但是你必须确保同时监控MousePressedMouseReleased,因为这个标志是平台依赖的。

答案 1 :(得分:0)

我认为你是在正确的道路上,因为我对scala波动的理解我认为问题在于你没有正确地附加听众。首先,我将按钮分配给一个值,并仅在其上调用listenTo:

create external table table1_orc(
col1 string,
col2 string,
col3 int
PARTITIONED BY ( 
`year` string,
`month` string,
`day` string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION '/base_path_orc/';

set hive.exec.dynamic.partition=true;
insert overwrite table table1_orc partition(year,month,day) select * from table1 where year = '2015' and month = '10' and day = '01';

然后,在反应中,如果它来自按钮,我会编写模式检查(如果你只调用val button = new Button("1") listenTo(button) 通过按钮可能是多余的)并且它有正确的按钮:

listenTo

因此,您在编辑中提供的代码将变为:

case ButtonClicked(b) if b == button && b.peer.getButton == MouseEvent.BUTTON_2 => ...

答案 2 :(得分:0)

以下对我有用:

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

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