2009-09-28 20 views
7

J'écris une application très simple dans Javafx où il y a un seul bouton avec une zone de texte sur la scène comme une scène. Maintenant, le comportement que je veux est que quand je clique sur le bouton je peux charger un autre scène avec un autre bouton et une zone de texte sur la scène et retirez le bouton que j'ai cliqué avec le texte précédent. Donc, le clic d'un bouton devrait charger une nouvelle scène sur la scène. des conseils sur la façon dont je peux le faire?Plusieurs scènes dans JavaFX

En suivant le conseil d'Eric: j'ai ce code, et il fonctionne comme je le veux.

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 

} 

Répondre

1

Si vous êtes sûr que vous n'aurez 2 scènes différentes, vous pouvez simplement lier la propriété scène de la scène comme ceci:

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

MISE À JOUR: Cela fonctionne en fait, si vous avez un certain nombre de scènes comme si:

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

vous pourriez demander pourquoi vous auriez plus de 2 scènes, au lieu d'opter pour le réglage « visible: false » sur chevauchement des nœuds du groupe à la place.

+0

J'ai plus de 2 scènes et cette technique est très bien pour 2 scènes parce que JavaFX ne permet pas si-else ou switch cas après bind scène. Y at-il un autre moyen que je peux essayer? – iceman

+0

J'ai mis à jour ma réponse. Considérez définitivement si vous voulez plusieurs scènes ou simplement plusieurs paramètres de personnalisation de CustomNodes comme approprié. –

+0

Est-il possible d'entrer des instructions d'impression de débogage dans une déclaration de scène pour savoir si elle est chargée ou appelée? Je ne peux pas appeler de méthode dans une scène. – iceman

1

Éliminer toutes les instructions if-else. Liez directement à une variable qui contient la scène actuelle.

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

Vous pouvez créer une scène Secon comme vous l'avez fait pour votre première. Dans le fuction du premier bouton vous remplacer showScene2 = true; avec: stage.setScene(scene2);