2012-10-21 40 views
13

Tôi đang sử dụng Netbeans 7.2 với Trình tạo cảnh 1.0 để phát triển một ứng dụng JavaFX. Tôi đã thiết lập màn hình chính của mình và tôi muốn có nó vì vậy tôi nhấp vào một nút và nó sẽ đóng cửa sổ chính và mở cửa sổ khác. Đối tượng Stage chính nằm trong lớp chính, nhưng lớp điều khiển là riêng biệt, và không thể truy cập nó vì nó không tĩnh và trong một lớp khác. Làm cách nào để thay đổi cảnh hoặc giai đoạn?JavaFX cách thay đổi giai đoạn

Trả lời

33

Download JavaFX samples tìm dự án FXML-LoginDemo, đó là những gì bạn cần. Để tham khảo nhanh chóng tôi sao chép dán lớp java chính ở đây;)

/* 
* Copyright (c) 2008, 2011 Oracle and/or its affiliates. 
* All rights reserved. Use is subject to license terms. 
* 
* This file is available and licensed under the following license: 
* 
* Redistribution and use in source and binary forms, with or without 
* modification, are permitted provided that the following conditions 
* are met: 
* 
* - Redistributions of source code must retain the above copyright 
* notice, this list of conditions and the following disclaimer. 
* - Redistributions in binary form must reproduce the above copyright 
* notice, this list of conditions and the following disclaimer in 
* the documentation and/or other materials provided with the distribution. 
* - Neither the name of Oracle Corporation nor the names of its 
* contributors may be used to endorse or promote products derived 
* from this software without specific prior written permission. 
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
*/ 
package demo; 

import demo.model.User; 
import demo.security.Authenticator; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.JavaFXBuilderFactory; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

/** 
* Main Application. This class handles navigation and user session. 
*/ 
public class App extends Application { 
    private Stage stage; 
    private User loggedUser; 

    private static App instance; 

    public App() { 
     instance = this; 
    } 

    public static App getInstance() { 
     return instance; 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override public void start(Stage primaryStage) { 
     try { 
      stage = primaryStage; 
      gotoLogin(); 
      primaryStage.show(); 
     } catch (Exception ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public User getLoggedUser() { 
     return loggedUser; 
    } 

    public boolean userLogging(String userId, String password){ 
     if (Authenticator.validate(userId, password)) { 
      loggedUser = User.of(userId); 
      gotoProfile(); 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public void userLogout(){ 
     loggedUser = null; 
     gotoLogin(); 
    } 

    private void gotoProfile() { 
     try { 
      replaceSceneContent("profile.fxml"); 
     } catch (Exception ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private void gotoLogin() { 
     try { 
      replaceSceneContent("login.fxml"); 
     } catch (Exception ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private Parent replaceSceneContent(String fxml) throws Exception { 
     Parent page = (Parent) FXMLLoader.load(App.class.getResource(fxml), null, new JavaFXBuilderFactory()); 
     Scene scene = stage.getScene(); 
     if (scene == null) { 
      scene = new Scene(page, 700, 450); 
      scene.getStylesheets().add(App.class.getResource("demo.css").toExternalForm()); 
      stage.setScene(scene); 
     } else { 
      stage.getScene().setRoot(page); 
     } 
     stage.sizeToScene(); 
     return page; 
    } 
} 
+0

Cảm ơn đây chính xác là những gì tôi đang tìm kiếm! –

+4

cập nhật liên kết bị hỏng :) – invariant

+1

là ngày này đúng không? tôi có nghĩa là, tôi có thể sử dụng này và gọi bên ngoài lớp App .replaceSceneContent? hoặc hôm nay (năm 2015) có cách nào để thực hiện thay đổi giữa các giai đoạn? thanks =) – user2582318

2

Bạn có thể làm theo cách này quá:

Sửa controller.java bạn theo cách này

Stage thisStage; 

public void setStage (Stage stage){ 
    thisStage = stage; 
} 

public void showStage(){ 
    thisStage.setTitle("Titel in der MainController.java geändert"); 
    thisStage.show(); 
} 

Điều quan trọng đó là bạn không sử dụng thisStage trong phương thức khởi tạo.

Sửa Mainclass bạn theo cách này:

@Override 
public void start(Stage stage) throws Exception { 
    URL location = getClass().getResource("Main.fxml"); 
    FXMLLoader fxmlLoader = new FXMLLoader(); 
    fxmlLoader.setLocation(location); 
    fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory()); 
    Parent root = (Parent) fxmlLoader.load(location.openStream()); 
    Scene scene = new Scene(root); 
    stage.setScene(scene); 
    MainController mainController = fxmlLoader.getController(); 
    mainController.setStage(stage); 
    mainController.showStage(); 
} 

Bạn có thể tải về một ví dụ Projekt (netbeans) here.

+0

liên kết bị hỏng, bạn có thể cung cấp liên kết khác không? – ConquerorsHaki

2

Tôi có thể nói điều gì đó tương tự ở đây, nhưng đây là cách tôi làm điều đó:

(Trong ví dụ này, tôi đang chuyển từ Login.fxml để Home.fxml).

Bên trong lớp LoginController.fxml, tôi đã tạo ra các phương pháp sau đây:

@FXML 
private void login(javafx.event.ActionEvent event) throws IOException 
{ 
    if(pwf1.getText().equals("dolphin")) 
    { 
      Parent blah = FXMLLoader.load(getClass().getResource("Home.fxml")); 
      Scene scene = new Scene(blah); 
      Stage appStage = (Stage) ((Node) event.getSource()).getScene().getWindow(); 
      appStage.setScene(scene); 
      appStage.show(); 
    } 
    else 
    { 
      label1.setText("Password is incorrect. Please Try Again"); 
    } 
} 

Và đó là nó .;)

2

Dựa trên câu hỏi của bạn, Gần đây tôi đã làm việc trên đang phát triển một iOS tương đương NavigationController cho JavaFX, sử dụng ý tưởng đơn giản nhất về chế độ xem đẩy và loại bỏ.

Hãy để tôi chia sẻ mã với cộng đồng: https://github.com/jalopezsuarez/javafx-screens

Ý tưởng, là để có một môi trường rất rất dễ dàng để giúp bạn thay đổi giữa các màn hình.

Hy vọng nó sẽ giúp bạn.

Các vấn đề liên quan