Установка высоты и ширины сцены и сцены в javafx
- Я разрабатываю одно приложение javafx.
- в моем приложении есть две сцены, одна сцена.
- в приложении высота и ширина для обеих сцен одинаковы или постоянны.
- таким образом, согласно моему исследованию, высота и ширина сцены остаются постоянными, которые упоминаются в конструкторе, но сцена настраивается с высотой и шириной сцены.
- когда я обедаю приложение с высотой и шириной этапа, который отличается от постоянн высота и ширина сцены после этого сцена регулируют с этапом.
но когда во время выполнения, когда я применяю 2-ю сцену, сцена не настраивается с высотой и шириной сцены.высота и ширина сцены остаются неизменными.
так что любое решение?
3 ответов
как я понимаю проблема выше запостил. Я думаю, что этап достаточно хорош, чтобы установить предпочтительную высоту и ширину в соответствии с слушателем получить новый запрос для применения к размеру windows. Но у него есть некоторые ограничения, если вы максимизируете или минимизируете экран javaFX и попытаетесь перейти на другой экран, тогда другой экран будет иметь тот же размер окна, но содержимое сцены будет искажено в высоту и ширину по умолчанию, e.g возьмите логин и домашнюю сцену в javafx (вся сцена screated с FXML-файл). Авторизоваться.fxml инициализируется его контроллером. Как вы уже упоминали, сцена инициализируется в конструкторе, поэтому она должна быть контроллером связанного fxml (на данный момент FXML тесно связан с контроллером). Вы собираетесь установить размер сцены (высота и ширина) в самом конструкторе.
1.) LoginController для входа.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.) То же самое для 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);
}
}
просто пытаться поставить сцену.hide() перед этапом.show () в каждом контроллере. Надеюсь, это вам поможет.
это потому, что сцена адаптирует свой размер к сцене, если явно не указано иначе...
вот одно решение:
stage.setScene(scene2);
stage.setHeight(1000);
stage.setWidth(1000);
и пример приложения:
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);
}
}
Я знаю, что это старая тема ,но это (ошибка?) сохраняется в Java7u75.
я столкнулся с такой же проблемой... решение, предложенное шамбху выше, работает, но приводит к видимому эффекту "переключения окон":
stage.hide();
stage.show();
я обнаружил, что следующий код решает проблему (получает этап "обновить") без каких-либо видимых эффектов:
final boolean resizable = stage.isResizable();
stage.setResizable(!resizable);
stage.setResizable(resizable);