首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在javafx中设置舞台和场景的高度和宽度

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

Stack Overflow用户
提问于 2013-09-25 07:23:18
回答 3查看 102.8K关注 0票数 18
  • 我开发了一个javafx应用程序。
  • 在我的应用程序中有两个场景和一个阶段。
  • 在应用中,两个场景的高度和宽度是相同或恒定的。
  • 因此,根据我的研究,场景的高度和宽度保持不变,在构造器中提到,但是场景随舞台的高度和宽度而调整。
  • 当我午餐的时候,用舞台的高度和宽度来应用,这与场景的高度和宽度不同,那么场景就会随着舞台的变化而调整。
  • 但在运行时,当我应用第二个场景时,场景不随stage.the的高度和宽度而调整,场景的高度和宽度保持不变。
  • 有什么解决办法吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-25 11:47:51

据我所知,上面贴出的问题。我认为这个阶段足够好,可以根据侦听器设置首选的高度和宽度,并在窗口大小上应用较新的请求。但是它也有一些限制,如果您最大化或最小化javaFX屏幕,并尝试导航到其他屏幕,则其他屏幕将具有相同的窗口大小,但场景内容将扭曲为默认的高度和宽度,例如在javafx中使用登录和家庭场景(所有场景都使用fxml)。Login.fxml由其控制器初始化。正如您已经提到的,场景是在构造函数中初始化的,所以它必须是相关FXML的控制器(到目前为止,FXML与控制器紧密耦合)。您将在构造函数本身中设置场景大小(高度和宽度)。

1.)LoginController for login.fxml

代码语言:javascript
复制
 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 --

代码语言:javascript
复制
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.)主班

代码语言:javascript
复制
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);
    }
}

只需尝试将Stage.hide()放在每个控制器中的Stage.show()之前。希望这能帮到你。

票数 11
EN

Stack Overflow用户

发布于 2013-09-26 11:42:28

那是因为舞台的大小要适应现场,除非有明确的指示.

到这里有一个解决方案:

代码语言:javascript
复制
stage.setScene(scene2);
stage.setHeight(1000);
stage.setWidth(1000);

以及一个示例应用程序:

代码语言:javascript
复制
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);
    }
}
票数 9
EN

Stack Overflow用户

发布于 2015-06-13 22:06:39

我知道这是个老话题,但是这个(bug?)在Java7u75中仍然存在。

我遇到了同样的问题..。上述shambhu提供的解决方案确实有效,但会产生可见的“窗口切换”效果:

代码语言:javascript
复制
stage.hide();
stage.show();

我发现以下代码解决了这个问题(进入“刷新”阶段),而没有任何可见的效果:

代码语言:javascript
复制
final boolean resizable = stage.isResizable();
stage.setResizable(!resizable);
stage.setResizable(resizable);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18998671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档