2009-09-28 246 views
7

我在Javafx中编写了一个非常简单的应用程序,其中一个按钮的舞台上有一个文本框作为一个scene.Now,我想要的行为是,当我点击按钮时,我可以加载另一个场景中的另一个按钮和一个文本框在舞台上,并删除按钮,我与前一个文本框一起点击。所以点击一个按钮应该在舞台上加载一个新的场景。有关我如何做到这一点的任何提示?JavaFX中的多个场景

按照Eric的建议:我有这个代码,它的工作方式是我想要的。

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 

} 

回答

1

如果你确信你只会有2个不同的场景,你可以在舞台的场景属性绑定像这样:

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

UPDATE:如果您有任何数量的这种实际工作场景像这样:

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

你可能会考虑为什么你有2点以上的场景,而是选择设置“可见:假”上重叠组节点来代替。

+0

我有2级以上的场景和这个技术只是罚款2点的场景,因为JavaFX的不允许现场绑定后的if-else或开关的情况下。有没有其他方法可以尝试? – iceman 2009-09-29 13:19:13

+0

我已经更新了我的答案。绝对考虑是否需要多个场景或多个CustomNode设置适当的可见性。 – 2009-09-29 16:58:38

+0

是否可以在场景声明中输入调试打印语句来知道它的加载或被调用?我无法在场景中调用任何方法。 – iceman 2009-09-30 08:26:23

1

消除所有if-else语句。直接绑定到包含当前场景的变量。

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

你可以像你第一次做一个secon场景。在 第一个按钮的机能的研究更换showScene2 = true;有:stage.setScene(scene2);