gpt4 book ai didi

java - 在 javafx 中设置舞台和场景的高度和宽度

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:53 24 4
gpt4 key购买 nike

  • 我开发了一个 javafx 应用程序。
  • 在我的应用程序中有两个场景和一个阶段。
  • 在应用中,两个场景的高度和宽度相同或恒定。
  • 根据我的研究,构造函数中提到的场景高度和宽度保持不变,但场景会根据舞台的高度和宽度自行调整。
  • 当我使用舞台高度和宽度与场景的恒定高度和宽度不同的应用程序时,场景随舞台调整。
  • 但是当我在运行时应用第二个场景时,场景不会随着舞台的高度和宽度进行调整。场景的高度和宽度保持不变。

  • 有什么解决办法吗?

最佳答案

据我了解上面发布的问题。我认为舞台足够好,可以根据听众设置首选高度和宽度,以获得适用于窗口大小的更新请求。但它有一些限制,如果您最大化或最小化 javaFX 屏幕并尝试导航到其他屏幕,那么其他屏幕将具有相同的窗口大小,但场景内容将扭曲为默认的高度和宽度,例如登录和 javafx 中的家庭场景(所有场景都是用 fxml 创建的)。 Login.fxml 由其 Controller 初始化。正如您所提到的,场景是在构造函数中初始化的,因此它必须是相关 fxml 的 Controller (截至目前,FXML 与 Controller 紧密耦合)。您将在构造函数本身中设置场景大小(高度和宽度)。

1.) login.fxml 的 LoginController

 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.) 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.) 主类

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);
}
}

只需尝试在每个 Controller 中将 Stage.hide() 放在 Stage.show() 之前。希望这对您有所帮助。

关于java - 在 javafx 中设置舞台和场景的高度和宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18998671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com