2013-06-21 4 views
6

menuItem을 선택하면 현재 장면을 닫고 다른 장면을 열 때 문제가 있습니다. 내 주요 단계는 다음과 같이 코딩 :이 menuItem이 onclick을 때 javaFX의 장면 전환

public void start(Stage primaryStage) throws Exception { 
    primaryStage.setTitle("Shop Management"); 
    Pane myPane = (Pane)FXMLLoader.load(getClass().getResource 
("createProduct.fxml")); 
    Scene myScene = new Scene(myPane);   
    primaryStage.setScene(myScene); 
    primaryStage.show(); 
} 

그런 다음 createProduct.fxml 내에서, 그것은이를 수행합니다 : 그것은 createCategory.fxml을 열어 않습니다

public void gotoCreateCategory(ActionEvent event) throws IOException { 
    Stage stage = new Stage(); 
    stage.setTitle("Shop Management"); 
    Pane myPane = null; 
    myPane = FXMLLoader.load(getClass().getResource("createCategory.fxml")); 
    Scene scene = new Scene(myPane); 
    stage.setScene(scene); 
    stage.show(); 
} 

. 그러나 createProduct.fxml 인 이전 패널은 닫히지 않습니다. 무언가가 stage.close()라고하는 것을 알고 있지만, 이것을 시작하려면 어디에서 시작 해야할지 모르겠다. 처음부터 메인 오른쪽에서 장면을 전달하지 않았기 때문이다. 어떻게 해결해야하는지 궁금합니다.

미리 감사드립니다. 당신은 시작 방법 등의 일부 변경을해야

+0

새 단계에서 다른 화면 (createCategory.fxml)을 열어야합니까? –

+0

Jframe을 알기 위해 노력하고 있습니까? getJFrame(). dispose(); \t \t \t \t \t \t \t eForumForgotPwd myWindow = new eForumForgotPwd(); \t \t \t \t \t \t \t myWindow.getJFrame(). setVisible (true); 새 창을 열기 전에 현재 창을 닫아야합니다. –

답변

11

..

public void start(Stage primaryStage) throws Exception { 
    primaryStage.setTitle("Shop Management"); 

    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("createProduct.fxml")); 

    Pane myPane = (Pane)myLoader.load(); 

    CreateProductController controller = (CreateProductController) myLoader.getController(); 

    controller.setPrevStage(primaryStage); 

    Scene myScene = new Scene(myPane);   
    primaryStage.setScene(myScene); 
    primaryStage.show(); 
} 

하고 CreateProductController.java이 될 것

public class CreateProductController implements Initializable { 

    Stage prevStage; 

    public void setPrevStage(Stage stage){ 
     this.prevStage = stage; 
    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
    } 

    public void gotoCreateCategory(ActionEvent event) throws IOException { 
     Stage stage = new Stage(); 
     stage.setTitle("Shop Management"); 
     Pane myPane = null; 
     myPane = FXMLLoader.load(getClass().getResource("createCategory.fxml")); 
     Scene scene = new Scene(myPane); 
     stage.setScene(scene); 

     prevStage.close(); 

     stage.show(); 
    } 

} 
+0

와우 감사드립니다. 그것은 완벽하게 작동했습니다. 정말로 정말로 감사합니다. 따라서 기본적으로 컨트롤러의 setPreviousStage 메소드에 primaryStage를 전달하여 previousStage를 가져옵니다. 그리고 그걸 닫으시겠습니까? 내가 올바른 방법으로 설명 했는가? –

+0

하지만 여전히 문제가 있습니다. 예를 들어 내 창은 모두 텍스트 필드입니다. 텍스트 필드를 채우지 않고 범주 창에서 제품 창으로 이동하면 null 포인터 예외 오류가 발생합니다. –

+0

텍스트 필드에 유효성 검사를 추가하고 null을 확인하십시오. –

2

당신의 몇 가지 문제를 해결하기 위해 여러 가지 방법을 가지고 그들에게 내가 너희에게 말한다. 귀하의 질문에서 이해 한 것은 상단에 탐색 (메뉴 막대)이 포함 된 응용 프로그램을 만들고이를 사용하여 사용자가 모든 화면으로 전환 할 수 있다는 것입니다.

가장 쉬운 방법은 탐색 모음을 정적으로 만들거나 화면에 전달하거나 다른 방법으로 전역으로 사용할 수있게 만드는 것입니다. 둘째, 단일 화면 (테두리 창)을 만들고 다른 화면 (중앙)을로드하십시오.

프로젝트에서 스프링 통합을 사용하여 더 나은 컨트롤러 주입을 제공 할 수도 있습니다. 참조 : http://www.zenjava.com/2011/10/25/views-within-views-controllers-within-controllers/

자신 만의 단일 화면 컨트롤러를 만들고이를 사용하여 다른 화면을 관리 할 수도 있습니다. 참조 : https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1

그러나이 (위)에 대해 현재 아키텍처를 변경하거나 업데이트해야합니다.

+0

기본적으로 start 메소드가 포함 된 클래스는 기본 페이지 만 실행하도록 설정되어 있습니까? 그리고 기본 페이지에서 탐색 모음을 정적으로 설정 했습니까? –