2009-09-28 2 views
7

하나의 장면으로 텍스트 상자가있는 단일 버튼이있는 Javafx에서 매우 간단한 응용 프로그램을 작성하고 있습니다. 이제 원하는 동작은 버튼을 클릭하면 다른 것을로드 할 수 있습니다. 장면을 다른 단추와 무대 위에있는 텍스트 상자로 옮기고 이전 텍스트 상자를 클릭 한 단추를 제거합니다. 버튼을 클릭하면 스테이지에 새로운 장면이로드됩니다. 내가 어떻게이 일을 할 수 있는지에 대한 어떤 암시라도?JavaFX의 다중 장면

에릭의 충고에 따르면 : 나는이 코드와 내가 원하는 방식으로 작동한다. 당신은 당신은 단지 2 개 개의 다른 장면이있을 것이다 확실한 경우

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

, 당신은과 같이 스테이지의 장면 속성을 바인딩 할 수 있습니다 :

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 
당신은 대신에 '눈에 보이는 : false'로 설정 말인가, 2 개 이상의 장면이있을 것이다 이유를 고려해 볼 수 있습니다

대신 그룹 노드를 중복에.

+0

다음 첫 번째 버튼의 fuction를 당신은 showScene2 = true;로 대체합니다. 내가 시도 할 수있는 다른 방법이 있습니까? – iceman

+0

답변을 업데이트했습니다. 다중 장면 또는 여러 CustomNodes 설정 가시성을 적절하게 설정하려는 경우 확실히 고려하십시오. –

+0

장면 선언 안에 디버그 인쇄 문을 입력하여로드 또는 호출 중임을 알 수 있습니까? 장면 내부에서 어떤 메서드를 호출 할 수 없습니다. – iceman

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

첫 번째 작업과 마찬가지로 초 장면을 만들 수 있습니다. 내가 2 개 이상의 장면을 가지고 자바 FX 장면 바인드 후 경우 - 다른 사람 또는 스위치 케이스를 허용하지 않기 때문에이 기술이 개 장면에 잘입니다 stage.setScene(scene2);