2013-09-25 18 views
6
  • Ich entwickle eine Javafx-Anwendung.
  • In meiner Anwendung gibt es zwei Szenen und eine Bühne.
  • In der Anwendung sind die Höhe und Breite für beide Szenen gleich oder konstant.
  • so nach meiner Forschung die Höhe und Breite für die Szene konstant bleiben, die Erwähnung im Konstruktor aber die Szene anpassen sich mit Höhe und Breite der Bühne.
  • wenn ich Mittagessen Anwendung mit der Höhe und Breite der Bühne, die anders als die konstante Höhe und Breite der Szene ist, dann Szene mit Bühne anpassen.
  • aber wenn zur Laufzeit wenn ich die zweite Szene anwende, dann wird die Szene nicht mit Höhe und Breite der Bühne angepasst. Die Höhe und Breite der Szene bleiben konstant.Höhe und Breite von Bühne und Szene in javafx setzen

  • so jede Lösung?

+0

Die Bühne muss aktualisiert werden, aber wie? – Anvay

Antwort

4

Wie ich das oben beschriebene Problem verstehe. Ich denke, die Bühne ist gut genug, um die bevorzugte Höhe und Breite nach dem Listener zu setzen, um die neuere Anfrage auf die Fenstergröße anzuwenden. Aber es hat einige Einschränkungen, wenn Sie den javaFX-Bildschirm maximieren oder minimieren und versuchen, zu einem anderen Bildschirm zu navigieren, dann hat der andere Bildschirm die gleiche Fenstergröße, aber der Szeneninhalt wird in die Standardhöhe und -breite verzerrt, z und home-Szene in javafx (alle Szene ist mit fxml behandelt). Login.fxml wird von seinem Controller initialisiert. Wie Sie erwähnt haben, wird diese Szene im Konstruktor initialisiert, also muss es der Controller der zugehörigen fxml sein (ab sofort ist FXML eng mit dem Controller gekoppelt). Sie werden die Szenengröße (Höhe & Breite) im Konstruktor selbst einstellen.

1.) LoginController für 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.) Das Gleiche gilt für 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.) Hauptklasse

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

Versuchen Sie einfach zu setzen Stage.hide() vor Stage.show() in jedem Controller. Ich hoffe, dass dir das weiterhilft.

6

Das liegt daran, dass die Bühne seiner Größe in der Szene passt, sofern nicht explizit Diferently angewiesen ...

Um hier eine Lösung:

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

Und eine Beispielanwendung:

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

Das von Ihnen gepostete Beispiel stimmt, das Konzept der Anwendung von Höhe und Breite auf der Bühne ist auch richtig. Aber wenn Sie ein Hintergrundbild auf beide Szenen anwenden und die Größe der Bühne ändern, versuchen Sie es finde heraus, dass es ein Problem ist. Beim zweiten Mal wird sich die Szene nicht mit der Bühne anpassen .......... also brauche ich einen Weg, um die Bühne aufzufrischen. – Anvay

+1

haben Sie versucht zu verwenden: stagePropio.sizeToScene(); ? – Magcus

+0

Das stage.sizeToScene() ist das richtige Konzept, aber ich möchte, dass die Szene mit der Stufe angepasst wird. – Anvay

1

Ich weiß, das ist ein altes Thema, aber das (Bug?) Besteht immer noch in Java7u75.

Ich lief in das gleiche Problem ...die Lösung von shambhu angeboten oben funktioniert, aber führt zu einem sichtbaren „Window-Switching-Effekt“:

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

ich, dass der folgende Code gefunden das Problem löst (wird auf die Bühne „refresh“) ohne sichtbare Auswirkungen:

final boolean resizable = stage.isResizable(); 
stage.setResizable(!resizable); 
stage.setResizable(resizable);