Кнопка ScalaFX => Как определить действие?

Я пытаюсь определить действие onAction для Button, выполненное в scalafx, но не могу заставить его работать.

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, но это тоже не работает.

Любая подсказка?

Спасибо


person Shelen    schedule 12.04.2016    source источник


Ответы (4)


Я не программист на Scala, но похоже, что вы смешиваете здесь две разные формы: лямбда-выражение и явный класс.

Пытаться

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*/
            }
        }

}

or

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*/
  }

}
person James_D    schedule 12.04.2016
comment
Хороший ответ, но вы также должны добавить import scalafx.Includes._ - это добавит некоторые неявные преобразования, которые, я думаю, необходимы для второй версии (с функцией, а не EventHandler). Вообще говоря, этот импорт всегда должен использоваться в коде ScalaFX. - person Cyäegha; 18.04.2016

Во-первых, при работе со 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._

person Jarek    schedule 25.04.2016

Вы можете использовать это для действия кнопки,

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

меня судят

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){...}
}

которые работают для меня.

person user7166292    schedule 22.01.2021