2009-09-28 11 views
7

Piszę bardzo prostą aplikację w Javafx, gdzie jest jeden przycisk z polem tekstowym na scenie jako jedna scena. Teraz, zachowanie, którego chcę, to to, że po kliknięciu przycisku mogę załadować kolejny scenę z innym przyciskiem i polem tekstowym na scenie i usuń przycisk, który kliknąłem wraz z poprzednim polem tekstowym. Tak więc kliknięcie przycisku powinno załadować nową scenę na scenie. wszelkie wskazówki, jak mogę to zrobić?Wiele scen w JavieFX

Po poradę Erica: mam ten kod i jego działanie tak, jak chcę.

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 

} 

Odpowiedz

1

Jeżeli jesteś pewien, że masz tylko 2 różne sceny, można po prostu powiązać właściwość scena Stage tak:

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

UPDATE: To faktycznie działa, jeśli masz dowolną liczbę sceny tak:

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

można rozważyć, dlaczego chcesz mieć więcej niż 2 sceny, zamiast decydując się na ustawienie „widoczny: false” na nakładające się węzły grupowe zamiast.

+0

mam więcej niż 2 sceny i technika ta jest po prostu w porządku na 2 scenach ponieważ JavaFX nie pozwalają if-else lub przełącznika razie po sceny wiążą. Czy jest jakiś inny sposób, w jaki mogę spróbować? – iceman

+0

Zaktualizowałem swoją odpowiedź. Zdecydowanie warto rozważyć, czy chcesz, aby wiele scen lub tylko kilka widoczności ustawień CustomNodes odpowiednio. –

+0

Czy można wprowadzić instrukcje drukowania debugowania w deklaracji sceny, aby wiedzieć, czy jest ładowany lub czy jest wywoływany? Nie mogę wywołać żadnej metody wewnątrz sceny. – iceman

1

Wyeliminuj wszystkie instrukcje if-else. Powiąż bezpośrednio ze zmienną zawierającą bieżącą scenę.

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

Możesz zrobić drugą scenę, tak jak zrobiłaś pierwszą. W fuction pierwszego przycisku na zastąpić showScene2 = true; z: stage.setScene(scene2);