2016-07-26 10 views
1

Ich arbeite an einer ScalaFX-Anwendung, die sowohl Steuerelemente als auch Modelle im selben Fenster hat (es ist ein Spiel). Wenn ich die Modelle hinzufüge, hören die Steuerelemente unglücklicherweise auf, Mausereignisse zu empfangen, obwohl sich die zwei nicht überlappen. Ein kleinstes Arbeitsbeispiel sieht wie folgt aus:JavaFX-Steuerelemente empfangen keine Mausereignisse, wenn auch Shape3D verwendet wird

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

Wenn ich die Kugel mit einer 2D-Form, wie Circle oder Rectangle, die Kontrollen werden in Reaktion wieder zu ersetzen; Es ist nur ein Problem, wenn ich 3D-Formen hinzufüge. Ich habe versucht, mouseTransparent und pickOnBounds auf dem Sphere löschen, aber keiner scheint zu funktionieren.

Wie kann ich zulassen, dass die Steuerelemente weiterhin Mausereignisse erhalten, wenn sie angeklickt werden? Es ist akzeptabel, dass die Modelle sie nicht empfangen.

Antwort

1

Wenn 2D-Mischen (Kontrollen) und 3D-Inhalte sollten Sie den 3D-Inhalt in einem SubScene, beispielsweise wie folgt wickeln:

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