2013-09-25 12 views
6
  • Sviluppo un'applicazione javafx.
  • Nella mia applicazione ci sono due scene e una fase.
  • Nell'applicazione l'altezza e la larghezza di entrambe le scene sono uguali o costanti.
  • così come da mia ricerca l'altezza e la larghezza per la scena rimangono costanti, menzionate nel costruttore ma la scena si aggiusta con altezza e larghezza del palcoscenico.
  • quando pranza applicazione con l'altezza e la larghezza del tavolino, che è diversa dalla costante altezza e larghezza della scena, quindi la scena si regola con lo stage.
  • ma quando in fase di esecuzione quando si applica la seconda scena, la scena non viene regolata con altezza e larghezza dello stage. L'altezza e la larghezza della scena rimangono costanti.Imposta altezza e larghezza dello stage e della scena in javafx

  • quindi qualsiasi soluzione?

+0

Il palco deve essere aggiornato ma come? – Anvay

risposta

4

Come ho capito il problema sopra postato. Penso che il palcoscenico sia abbastanza buono da impostare l'altezza e la larghezza preferite come per l'ascoltatore per ottenere la nuova richiesta da applicare sulle dimensioni di Windows. Ma ha alcune limitazioni, se ingrandisci o riduci lo schermo di javaFX e proverai a navigare su un'altra schermata, l'altra schermata avrà le stesse dimensioni della finestra, ma il contenuto della scena verrà distorto nell'altezza e larghezza predefinite, ad esempio, fai un login e la scena domestica in javafx (tutta la scena è riprodotta con fxml). Login.fxml è inizializzato dal suo controller. Come hai già detto, la scena è inizializzata nel costruttore, quindi deve essere il controller del fxml correlato (dal momento che FXML è strettamente associato al controller). Stai per impostare la dimensione della scena (altezza &) nel costruttore stesso.

1.) LoginController per 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.) Lo stesso per 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.) Classe principale

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

solo cercare di mettere Stage.hide() prima di Stage.show() in ogni controller. Spero che questo ti possa aiutare.

6

Questo è perché lo stage si adatta la sua dimensione per la scena, se non esplicitamente indicato diferently ...

A qui è una soluzione:

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

E un'applicazione di esempio:

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

L'esempio postato da te ha ragione, anche il concetto di applicazione dell'altezza e della larghezza allo stage è corretto. Ma se applichi l'immagine di sfondo ad entrambe le scene e cambi le dimensioni del palco (prova diverse dimensioni) all'evento click di entrambi i pulsanti, allora capisci il problema reale. La seconda volta la scena non si aggiusterà con il palco .......... quindi ho bisogno di un modo per aggiornare il palco. – Anvay

+1

hai provato a utilizzare: stagePropio.sizeToScene(); ? – Magcus

+0

Lo stage.sizeToScene() è il concetto giusto ma voglio che la scena si aggiusti con il palcoscenico. – Anvay

1

So che questo è un vecchio argomento, ma questo (bug?) Persiste ancora in Java7u75.

Mi sono imbattuto nello stesso problema ...la soluzione offerta da Shambhu sopra funziona, ma produce un visibile "commutazione finestra" effetto:

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

ho trovato che il seguente codice risolve il problema (ottiene la fase di "refresh"), senza effetti visibili:

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