2013-09-25 26 views
6
  • Tôi phát triển một ứng dụng javafx.
  • Trong ứng dụng của tôi có hai cảnh và một giai đoạn.
  • Trong ứng dụng, chiều cao và chiều rộng cho cả hai cảnh đều giống nhau hoặc không đổi.
  • vì vậy theo nghiên cứu của tôi chiều cao và chiều rộng cho cảnh vẫn không đổi mà đề cập đến trong các nhà xây dựng nhưng cảnh điều chỉnh chính nó với chiều cao và chiều rộng của sân khấu.
  • khi tôi áp dụng bữa trưa với chiều cao và chiều rộng của giai đoạn khác với chiều cao và chiều rộng không đổi của cảnh rồi cảnh điều chỉnh theo giai đoạn.
  • nhưng khi ở thời gian chạy khi tôi áp dụng cảnh thứ 2 thì cảnh không được điều chỉnh với chiều cao và chiều rộng của sân khấu. Chiều cao và chiều rộng của cảnh vẫn không đổi.Đặt Chiều cao và Chiều rộng của Giai đoạn và Cảnh trong javafx

  • để giải pháp nào?

+0

Giai đoạn cần phải làm mới nhưng làm cách nào? – Anvay

Trả lời

4

Khi tôi hiểu vấn đề ở trên được đăng. Tôi nghĩ rằng giai đoạn là đủ tốt để thiết lập chiều cao và chiều rộng ưa thích theo người nghe nhận được yêu cầu mới hơn để áp dụng trên kích thước cửa sổ. Nhưng nó có một số hạn chế, nếu bạn tối đa hóa hoặc thu nhỏ màn hình javaFX và sẽ cố gắng điều hướng đến màn hình khác thì màn hình khác sẽ có cùng kích thước cửa sổ nhưng nội dung cảnh sẽ bị biến dạng thành chiều cao và chiều rộng mặc định, ví dụ như đăng nhập và cảnh nhà trong javafx (tất cả các cảnh được screated với fxml). Login.fxml được khởi tạo bởi bộ điều khiển của nó. Như bạn đã đề cập cảnh đó được khởi tạo trong hàm khởi tạo, vì vậy nó phải là bộ điều khiển của fxml liên quan (hiện tại FXML được kết hợp chặt chẽ với bộ điều khiển). Bạn sẽ thiết lập kích thước khung cảnh (chiều cao & chiều rộng) trong bản thân hàm tạo.

1.) LoginController cho login.fxml

import javafx.beans.value.ChangeListener; 
    import javafx.beans.value.ObservableValue; 
    import javafx.fxml.FXMLLoader; 
    import javafx.scene.Parent; 
    import javafx.scene.Scene; 
    import javafx.stage.Stage; 

    import java.io.IOException; 

    class LoginController { 

     private Stage stage; 
     private Scene scene; 
     private Parent parent; 
     @FXML 
     private Button gotoHomeButton;   

     public LoginController() throws Exception { 
      FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/login.fxml")); 
      fxmlLoader.setController(this); 
      try { 
       parent = (Parent) fxmlLoader.load(); 
       // set height and width here for this login scene 
       scene = new Scene(parent, 1000, 800); 
      } catch (IOException ex) { 
       System.out.println("Error displaying login window"); 
       throw new RuntimeException(ex); 
      } 
     } 

     // create a launcher method for this. Here I am going to take like below-- 
     public void launchLoginScene(Stage stage) { 
      this.stage = stage; 
      stage.setScene(scene); 
      stage.setResizable(true); 

      stage.widthProperty().addListener(new ChangeListener<Number>() { 
       @Override 
       public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) { 
        setCurrentWidthToStage(number2); 
       } 
      }); 

      stage.heightProperty().addListener(new ChangeListener<Number>() { 
       @Override 
       public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) { 
        setCurrentHeightToStage(number2); 
       } 
      }); 

      //Don't forget to add below code in every controller 
      stage.hide(); 
      stage.show(); 

     } 

     @FXML 
     public void authenticateUser(ActionEvent actionEvent) { 

     // write your logic to authenticate user 


     // 
     new HomeController().displayHomeScreen(stage); 

     } 

     private void setCurrentWidthToStage(Number number2) { 
      stage.setWidth((double) number2); 
     } 

     private void setCurrentHeightToStage(Number number2) { 
      stage.setHeight((double) number2); 
     } 
    } 

2.) Tương tự cho HomeController -

public class HomeController { 

    private Parent parent; 
    private Stage stage; 
    private Scene scene; 


    public HomeController(){ 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/home.fxml")); 
     fxmlLoader.setController(this); 
     try { 
      parent = (Parent) fxmlLoader.load(); 
       // set height and width here for this home scene 
       scene = new Scene(parent, 1000, 800); 
     } catch (IOException e) { 
     // manage the exception 
     } 
    } 

    public void displayHomeScreen(Stage stage){ 
     this.stage = stage; 
     stage.setScene(scene); 

     // Must write 
     stage.hide() 
     stage.show(); 
    } 
} 

3.) lớp Main

import javafx.application.Application; 

import javafx.stage.Stage; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     new LoginController().launchLoginScene(primaryStage); 
    } 


    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Chỉ cần cố gắng đưa Stage.hide() trước Stage.show() trong mọi bộ điều khiển. Tôi mong rằng nó giúp ích được cho bạn.

6

Đó là bởi vì các giai đoạn điều chỉnh kích thước của nó đến hiện trường, trừ khi chỉ dẫn rõ ràng diferently ...

Để đây là một giải pháp:

stage.setScene(scene2); 
stage.setHeight(1000); 
stage.setWidth(1000); 

Và một ứng dụng mẫu:

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.AnchorPane; 
import javafx.stage.Stage; 

public class Test extends Application { 

    @Override 
    public void start(final Stage stage) throws Exception { 

     AnchorPane anchor1 = new AnchorPane(); 
     final Scene scene1 = new Scene(anchor1, 250, 250); 
     Button boton1 = new Button(); 
     anchor1.getChildren().add(boton1); 

     AnchorPane anchor2 = new AnchorPane(); 
     final Scene scene2 = new Scene(anchor2, 500, 500); 
     Button boton2 = new Button(); 
     anchor2.getChildren().add(boton2); 

     boton2.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent arg0) { 
       // TODO Auto-generated method stub 
       stage.setScene(scene1); 
       stage.setHeight(1000); 
       stage.setWidth(1000); 
      } 
     }); 

     boton1.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent arg0) { 
       // TODO Auto-generated method stub 
       stage.setScene(scene2); 
       stage.setHeight(1000); 
       stage.setWidth(1000); 
      } 
     }); 
     stage.setScene(scene1); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Mẫu được đăng bởi bạn là đúng khái niệm áp dụng chiều cao và chiều rộng cho giai đoạn cũng đúng. Nhưng nếu bạn áp dụng hình nền cho cả cảnh và thay đổi kích thước của giai đoạn (thử kích thước khác) trên sự kiện nhấp của cả hai nút thì bạn sẽ tìm ra vấn đề thực tế. Lần thứ hai cảnh sẽ không nhận được điều chỉnh với giai đoạn .......... vì vậy tôi cần một cách để làm mới sân khấu. – Anvay

+1

bạn đã cố gắng sử dụng: stagePropio.sizeToScene(); ? – Magcus

+0

Stage.sizeToScene() là khái niệm đúng nhưng tôi muốn cảnh để có được điều chỉnh với sân khấu. – Anvay

1

Tôi biết đây là chủ đề cũ, nhưng lỗi này (lỗi?) Vẫn tồn tại trong Java7u75.

Tôi đã gặp sự cố tương tự ...các giải pháp được cung cấp bởi bé cho ở trên không làm việc, nhưng kết quả trong một có thể nhìn thấy "chuyển đổi cửa sổ" có hiệu lực:

stage.hide(); 
stage.show(); 

tôi thấy rằng đoạn mã sau giải quyết vấn đề (được sân khấu để "làm mới") mà không bất kỳ tác dụng có thể nhìn thấy:

final boolean resizable = stage.isResizable(); 
stage.setResizable(!resizable); 
stage.setResizable(resizable); 
Các vấn đề liên quan