2009-09-28 42 views
7

Escribo una aplicación muy simple en Javafx donde hay un solo botón con un cuadro de texto en el escenario como una escena. Ahora, el comportamiento que quiero es que cuando hago clic en el botón puedo cargar otro escena con otro botón y un cuadro de texto en el escenario y quite el botón que hice clic junto con el cuadro de texto anterior. Entonces, el clic de un botón debería cargar una nueva escena en el escenario. algún consejo sobre cómo puedo hacer esto?Múltiples escenas en JavaFX

Siguiendo el consejo de Eric: tengo este código, y está funcionando como quiero.

var showScene1 = true; 
var showScene2 = false; 
var showScene3 = false; 

def stage = Stage 
{ 
    title: "Hello World" 

    var scene1 =Scene 
    { 
      content: 
      [ 

            Text { 
          font : Font { 
            size: 24 
          } 
          x: 10, y: 30 
          content: "HelloWorld from Scene1" 
        }, 
        Button 
         { 
          text: "Click Me to change to Scene2 " 
          onMouseClicked: function(e: MouseEvent):Void 
          { 

            showScene2 = true; 

            println("In scene 2"); 

          } 

         } 


      ] 
    } 



    var scene2 =Scene 
     { 
       content: 
       [ 

             Text { 
           font : Font { 
             size: 24 
           } 
           x: 10, y: 30 
           content: "HelloWorld from Scene2" 
         }, 
         Button 
          { 
           text: "Click Me to change to Scene3 " 
           onMouseClicked: function(e: MouseEvent):Void 
           { 
             showScene1 = false; 
             showScene2 = false; 
             showScene3 = true; 
             println("In scene 3"); 

           } 

          } 


       ] 
     } 

    var scene3 =Scene 
     { 
       content: 
       [ 

             Text { 
           font : Font { 
             size: 24 
           } 
           x: 10, y: 30 
           content: "HelloWorld from Scene3" 
         } 


       ] 
     } 


scene: bind if (showScene2) then scene2 
    else if (showScene1) then scene1 
    else scene3 

} 

Respuesta

1

Si está seguro de que sólo tendrá 2 escenas diferentes, que sólo puede enlaza la propiedad escenario de la Etapa de este modo:

var showSecondScene = false; 
var myButton = Button { 
    onMouseClicked: function(e) { showSecondScene = true; } 
} 
def stage = Stage { 
    scene: bind if (showSecondScene) then secondScene else firstScene 
} 

ACTUALIZACIÓN: En realidad, esto funciona si usted tiene cualquier número de escenas de este modo:

scene: bind if (showScene1) then scene1 
    else if (showScene2) then scene2 
    else scene3 

Es posible considerar por qué tendrías más de 2 escenas, en vez de optar por establecer 'visible: false' en la superposición de nodos de grupo en su lugar.

+0

tengo más de 2 escenas y esta técnica está muy bien para 2 escenas porque JavaFX no permite if-else o switch caso tras escena se unen. ¿Hay alguna otra forma en que pueda intentarlo? – iceman

+0

He actualizado mi respuesta. Definitivamente considere si desea varias escenas o solo varios CustomNodes configurando la visibilidad según corresponda. –

+0

¿Es posible introducir instrucciones de impresión de depuración dentro de una declaración de escena para saber si se está cargando o llamando? No puedo llamar a ningún método dentro de una escena. – iceman

1

Elimina todas las sentencias if-else. Enlace directamente a una variable que contiene la escena actual.

import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.text.Text; 
import javafx.scene.text.Font; 

var currentScene: Scene; 


def scene1: Scene = Scene { 
    content: Text { 
     font : Font { 
      size : 24 
     } 
     x: 10, y: 30 
     content: "Scene 1" 
     onMouseClicked: function(e):Void { 
     currentScene = scene2; 
     } 
    } 
} 

def scene2: Scene = Scene { 
    content: Text { 
     font : Font { 
      size : 24 
     } 
     x: 10, y: 30 
     content: "Scene 2" 
     onMouseClicked: function(e):Void { 
     currentScene = scene1; 
     } 
    } 
} 

Stage { 
    title: "Multi-Scene" 
    width: 250 
    height: 80 
    scene: bind currentScene 
} 

currentScene = scene1; 
0

Puede hacer una segunda escena como la primera. En el fuction del primer botón que reemplace showScene2 = true; con: stage.setScene(scene2);