2016-07-26 2 views
1

Я работаю над приложением ScalaFX, которое имеет как элементы управления, так и модели в одном окне (это игра). К сожалению, когда я добавляю модели, элементы управления перестают принимать события мыши, даже если они не перекрываются. Наименьший рабочий пример выглядит следующим образом:Ядро JavaFX не принимает события мыши, когда также использует Shape3D

import scalafx.Includes._ 
import scalafx.application.JFXApp 
import scalafx.application.JFXApp.PrimaryStage 
import scalafx.scene._ 
import scalafx.scene.control._ 
import scalafx.scene.input.MouseEvent 
import scalafx.scene.layout._ 
import scalafx.scene.shape._ 

object GameWindow extends JFXApp { 
    stage = new PrimaryStage { 
    scene = new Scene(800, 600, true, SceneAntialiasing.Balanced) { 
     root = new VBox(
     new Button("Click me!") { 
      handleEvent(MouseEvent.MouseClicked) { 
      me: MouseEvent => Console println "clicked!" 
      } 
     }, 
     new Sphere() { 
      radius = 100 
     }) 
    } 
    } 
} 

Если я заменяю сферу с 2D форме, как Circle или Rectangle элементы управления становятся отзывчивым снова; это только проблема, когда я добавляю 3D-фигуры. Я попытался установить mouseTransparent и очистить pickOnBounds на Sphere, но ни один из них не работает.

Как я могу позволить элементам управления продолжать получать события мыши при их нажатии? Для моделей приемлемо не принимать их.

ответ

1

При смешивании 2D (управления) и 3D-контента, вы должны обернуть 3D-контента в SubScene, например, так:

object GameWindow3D extends JFXApp { stage = new PrimaryStage { scene = new Scene(800, 600, true, SceneAntialiasing.Balanced) { root = new VBox( new Button("Click me!") { handleEvent(MouseEvent.MouseClicked) { me: MouseEvent => Console println "clicked!" } }, new SubScene(400, 400, true, SceneAntialiasing.Balanced) { root = new VBox { children = new Sphere() { radius = 100 } } } ) } } }