【问题标题】:ScalaFX Button => How to define the action?ScalaFX 按钮 => 如何定义动作?
【发布时间】:2016-08-02 22:17:18
【问题描述】:

我正在尝试为 scalafx 中完成的 Button 定义 onAction accion,但我无法使其工作。

package App.Desktop

import javafx.event.EventHandler

import scalafx.event.ActionEvent

import scalafx.scene.control.Button

class Window() {

  btn_YES.onAction = (event: ActionEvent) => 
   new EventHandler[ActionEvent] {
     override def handle(event: ActionEvent) {
        /*Do something*/
      }
    }
  }
}

我已经这样做了,但我得到一个错误

Error: type mismatch;
 found   : scalafx.event.ActionEvent => javafx.event.EventHandler[scalafx.event.ActionEvent]
 required: javafx.event.EventHandler[javafx.event.ActionEvent]
  btn_YES.onAction = (event: ActionEvent) => new EventHandler[ActionEvent]

我也尝试使用javafx.event.ActionEvent 代替scalafx,但它也不起作用。

有什么线索吗?

谢谢

【问题讨论】:

    标签: scala javafx scalafx


    【解决方案1】:

    我试过了

    Import scalafx.Includes._
    import scalafx.event.ActionEvent
    
    btn_YES.onAction = (event: ActionEvent) =>  {
      /*Do something*/
    }
    ...
    
    import scalafx.Includes._
    
    btn_YES.onAction = handle {
      /*Do something*/
    }
    

    在 javafx.scene.SubScene.setOnKeyPressed (..)、setOnMouseEntered(..) 上它肯定不起作用。

    new EventHandler[KeyEvent]() {
          override def handle(event:KeyEvent){...}
    }
    

    这对我有用。

    【讨论】:

      【解决方案2】:

      拳头,使用 ScalaFX 导入 scalafx.Includes._ 很重要。它带来了许多 ScalaFX 功能。

      有两种推荐的方法来添加onAction 处理程序。主要是使用(event:ActionEvent) => { ... )闭包:

      import scalafx.Includes._
      import scalafx.event.ActionEvent
      
      btn_YES.onAction = (event: ActionEvent) =>  {
        /*Do something*/
      }
      

      如果你不关心event 对象。您可以节省一些输入并使用handle {...}

      import scalafx.Includes._
      
      btn_YES.onAction = handle {
        /*Do something*/
      }
      

      在这两种情况下你都需要导入scalafx.Includes._

      【讨论】:

        【解决方案3】:

        我不是 Scala 程序员,但看起来您在这里混合了两种不同的形式:lambda 表达式和显式类。

        试试

        package App.Desktop
        
        import javafx.event.EventHandler
        
        import javafx.event.ActionEvent
        
        import scalafx.scene.control.Button
        
        class Window() {
        
            btn_YES.onAction = 
                new EventHandler[ActionEvent] {
                    override def handle(event: ActionEvent) {
                        /*Do something*/
                    }
                }
        
        }
        

        package App.Desktop
        
        import javafx.event.EventHandler
        
        import javafx.event.ActionEvent
        
        import scalafx.scene.control.Button
        
        class Window() {
        
          btn_YES.onAction = (event: ActionEvent) =>  {
                /*Do something*/
          }
        
        }
        

        【讨论】:

        • 好答案,但您还应该添加import scalafx.Includes._ - 它会添加一些隐式转换,我认为这对于第二个版本是必要的(使用函数而不是EventHandler)。一般来说,ScalaFX 代码中应始终使用此导入。
        【解决方案4】:

        您可以将其用于按钮操作,

        btn_YES.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                    //Do some action here
            }
        });
        

        【讨论】:

          猜你喜欢
          • 2020-05-11
          • 1970-01-01
          • 2019-12-15
          • 1970-01-01
          • 2017-11-04
          • 2018-11-26
          • 2012-10-06
          • 2021-02-08
          相关资源
          最近更新 更多