2013-09-25 2 views
6
  • Я разработал одно приложение javafx.
  • В моем приложении есть две сцены и один этап.
  • В приложении высота и ширина для обеих сцен одинаковы или постоянны.
  • , так как в моем исследовании высота и ширина сцены остаются неизменными, что упоминается в конструкторе, но сцена корректируется с высотой и шириной сцены.
  • Когда я предлагаю обед с высотой и шириной сцены, которая отличается от постоянной высоты и ширины сцены, тогда сцена корректируется со сценой.
  • , но когда во время выполнения, когда я применяю 2-ю сцену, сцена не регулируется высотой и шириной сцены. Высота и ширина сцены остаются неизменными.Высота и ширина сцены и сцены в javafx

  • поэтому любое решение?

+0

Этап необходимо обновить, но как? – Anvay

ответ

4

Как я понимаю, проблема выше размещена. Я думаю, что сцена достаточно хороша, чтобы установить предпочтительную высоту и ширину, так как слушатель получает новый запрос на размер окна. Но у него есть некоторые ограничения, если вы максимизируете или минимизируете экран javaFX и пытаетесь перейти на другой экран, тогда другой экран будет иметь одинаковый размер окна, но контент сцены будет искажен по умолчанию по высоте и ширине, например, возьмите логин и домашняя сцена в javafx (вся сцена скреплена с помощью fxml). Login.fxml инициализируется его контроллером. Как вы уже упоминали, что сцена инициализируется в конструкторе, поэтому он должен быть контроллером связанного fxml (на данный момент FXML тесно связан с контроллером). Вы собираетесь установить размер сцены (высота & width) в самом конструкторе.

1.) LoginController для 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.) То же для 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); 
    } 
} 

Просто попробуйте поставить Stage.hide() перед Stage.show() в каждом контроллере. Надеюсь, это поможет вам.

6

Это происходит потому, что этап адаптирует его размер на сцену, если явно не указано diferently ...

Чтобы здесь одно решение:

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

Образец, который вы указали правильно, также относится к концепции применения высоты и ширины к сцене. Но если вы примените фоновое изображение к обеим сценам и измените размер сцены (попробуйте разный размер) при нажатии события обеих кнопок, вы будете выясните фактическую проблему. Во второй раз сцена не будет корректироваться со сценой .......... поэтому мне нужен способ обновить сцену. – Anvay

+1

Вы пытались использовать: stagePropio.sizeToScene(); ? – Magcus

+0

Stage.sizeToScene() - это правильная концепция, но я хочу, чтобы сцена менялась со сценой. – Anvay

1

Я знаю, что это старая тема, но эта (ошибка?) По-прежнему сохраняется в Java7u75.

Я столкнулся с тем же вопросом ...решение, предложенное Шамбх выше делает работу, но приводит к видимым «переключению окна» эффект:

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

я обнаружил, что следующий код решает эту проблему (получает на сцену, чтобы «обновить») без каких-либо видимых эффектов:

final boolean resizable = stage.isResizable(); 
stage.setResizable(!resizable); 
stage.setResizable(resizable); 
Смежные вопросы