2013-09-25 15 views
6
  • Rozwijam jedną aplikację javafx.
  • W mojej aplikacji są dwie sceny i jeden etap.
  • W aplikacji wysokość i szerokość obu scen są takie same lub stałe.
  • Tak jak w moich badaniach wysokość i szerokość sceny pozostają stałe, o czym wspomina konstruktor, ale scena dostosowuje się do wysokości i szerokości sceny.
  • w aplikacji lunchowej o wysokości i szerokości sceny, która jest inna niż stała wysokość i szerokość sceny, a następnie scena dostosowuje się do sceny.
  • , ale gdy w czasie wykonywania, gdy zastosuję drugą scenę, scena nie zostanie dopasowana do wysokości i szerokości sceny. Wysokość i szerokość sceny pozostają stałe.Ustaw wysokość i szerokość sceny i sceny w javafx

  • , więc jakieś rozwiązanie?

+0

Etap trzeba odświeżyć, ale jak? – Anvay

Odpowiedz

4

Jak rozumiem powyżej opisany problem. Myślę, że etap jest wystarczająco dobry, aby ustawić preferowaną wysokość i szerokość, ponieważ odbiorca otrzymuje nowszą prośbę o zastosowanie w rozmiarze okna. Ale ma pewne ograniczenia, jeśli zmaksymalizujesz lub zminimalizujesz ekran javaFX i spróbujesz przejść do innego ekranu, wtedy inny ekran będzie miał taki sam rozmiar okna, ale zawartość sceny zostanie zniekształcona do domyślnej wysokości i szerokości, np. Zaloguj się i scena domowa w javafx (cała scena jest wywoływana fxml). Login.fxml jest inicjowany przez kontroler. Jak już wspomniałeś, scena jest inicjowana w konstruktorze, więc musi to być kontroler powiązanego fxml (jak na razie FXML jest ściśle sprzężony z kontrolerem). Zamierzasz ustawić rozmiar sceny (wysokość & szerokość) w samym konstruktorze.

1.) LoginController dla 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.) sam dla 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.) Główna klasa

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

Wystarczy spróbować umieścić Stage.hide() przed Stage.show() w każdym kontrolerze. Mam nadzieję, że to ci pomoże.

6

To dlatego, że etap dostosowuje swój rozmiar do sceny, chyba że wyraźnie polecił diferently ...

Aby tu jest jedno rozwiązanie:

stage.setScene(scene2); 
stage.setHeight(1000); 
stage.setWidth(1000); 

I Przykładowa aplikacja:

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

Próbka wysłana przez ciebie ma rację, koncepcja stosowania wysokości i szerokości na scenie również jest poprawna. Ale jeśli zastosujesz obraz tła do obu scen i zmienisz rozmiar sceny (spróbuj innego rozmiaru) na zdarzeniu kliknięcia obu przycisków, to Wykreślić rzeczywisty problem. Po raz drugi scena nie będzie się dostosowywać ze sceną .......... więc potrzebuję sposobu na odświeżenie sceny. – Anvay

+1

Czy próbowałeś użyć: stagePropio.sizeToScene(); ? – Magcus

+0

The stage.sizeToScene() jest właściwym pomysłem, ale chcę, aby scena została dopasowana do sceny. – Anvay

1

Wiem, że to stary temat, ale ten (błąd?) Nadal występuje w Java7u75.

Wpadłem na ten sam problem ...Rozwiązanie oferowane przez Shambhu powyżej działa, ale wyniki w widocznym „Przełączanie okno” efekt:

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

Okazało się, że następujący kod rozwiązuje problem (dostaje scenę do „odświeżenia”) bez żadnych widocznych efektów:

final boolean resizable = stage.isResizable(); 
stage.setResizable(!resizable); 
stage.setResizable(resizable); 
Powiązane problemy