[英]Set Height and Width of Stage and Scene in javafx
but when at the run time when i apply the 2nd scene then scene is not adjust with height and width of stage.the height and width of scene remain constant. 但是在运行时,当我应用第二个场景时,场景不会根据舞台的高度和宽度进行调整。场景的高度和宽度保持不变。
so any solution? 那有什么办法吗?
That is because the Stage adapts its size to the scene, unless explicitly instructed diferently... 这是因为除非明确指示,否则舞台会根据场景调整其大小......
To here is one solution: 这是一个解决方案:
stage.setScene(scene2);
stage.setHeight(1000);
stage.setWidth(1000);
And a sample application: 一个示例应用程序:
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);
}
}
As I understand the problem above posted. 据我了解上面发布的问题。 I think the stage is good enough to set the preferred height and width as per the listener get the newer request to apply on the windows size. 我认为舞台足够好,可以根据听众设置首选的高度和宽度,获取更新的窗口大小请求。 But it has some limitations, if you maximize or minimize the javaFX screen and will try to navigate to other screen then other screen will be having same window size but the scene content will distorted into the default height and width of it, eg take a login and home scene in javafx (all scene is screated with fxml). 但它有一些限制,如果你最大化或最小化javaFX屏幕并将尝试导航到其他屏幕然后其他屏幕将具有相同的窗口大小但场景内容将扭曲到它的默认高度和宽度,例如,登录和javafx中的家庭场景(所有场景都用fxml进行处理)。 Login.fxml is initialized by its controller. Login.fxml由其控制器初始化。 As you have mentioned that scene is initialized in constructor, so it must be the controller of the related fxml(as of now FXML is tight coupled with controller). 正如您所提到的那样,场景在构造函数中初始化,因此它必须是相关fxml的控制器(截至目前FXML与控制器紧密耦合)。 You are going to set the scene size(height & width) in constructor itself. 您将在构造函数本身中设置场景大小(高度和宽度)。
1.) LoginController for login.fxml 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.) Same for HomeController -- 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.) Main class 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);
}
}
Just try to put Stage.hide() before Stage.show() in every controller. 只是尝试将Stage.show()放在每个控制器中的Stage.show()之前。 I hope this will help you out. 我希望这会帮助你。
I know this is an old topic, but this (bug?) still persists in Java7u75. 我知道这是一个古老的话题,但是这个(bug?)仍然存在于Java7u75中。
I ran into the same issue... the solution offered by shambhu above does work, but results in a visible "window switching" effect: 我遇到了同样的问题......上面shambhu提供的解决方案确实有效,但会产生可见的“窗口切换”效果:
stage.hide();
stage.show();
I found that the following code solves the problem (gets the stage to "refresh") without any visible effects: 我发现以下代码解决了问题(获得“刷新”阶段)没有任何可见效果:
final boolean resizable = stage.isResizable();
stage.setResizable(!resizable);
stage.setResizable(resizable);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.