- 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?
risposta
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.
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);
}
}
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
hai provato a utilizzare: stagePropio.sizeToScene(); ? – Magcus
Lo stage.sizeToScene() è il concetto giusto ma voglio che la scena si aggiusti con il palcoscenico. – Anvay
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);
Il palco deve essere aggiornato ma come? – Anvay