2016-04-07 4 views
5

J'ai cherché une méthode pour cela, mais j'ai seulement trouvé This question without answers. Je développe dans un ordinateur portable 1366x768, j'utilise JavaFX pour créer une interface graphique (je suis désolé, mais je ne peux pas poster le code, c'est essentiellement un AnchorPane contenant un couple GridPanes, qui contiennent plus de GridPanes, qui contiennent des étiquettes , TextFields et quelques graphiques).Mise à l'échelle de résolution d'écran JavaFX

Le problème survient lorsque je charge le projet sur une autre résolution (1920 x 1080 ou 1600 x 900). J'utilise stage.setMaximized(true);, mais cela ne fait qu'échelonner l'arrière-plan, la scène elle-même, de sorte que tous les éléments et conteneurs (panneaux, étiquettes, champs de texte .....) restent de la même taille qu'avec la résolution 1366x768, ce qui rend le GUI "ne correspond pas" à des résolutions qui ne sont pas exactement 1366x768.

J'espère avoir expliqué mon problème assez bien, mon anglais est loin d'être parfait.

Quelqu'un a-t-il une suggestion sur la façon de faire évoluer les éléments avec la résolution de scène?

(J'ai besoin que le logiciel soit agrandi ou plein écran dans chaque moniteur, donc faire une résolution fixe (1366x768, par exemple) ne semble pas être une bonne solution).

Merci à tous.

Mise à jour:

Je viens de créer un petit exemple. C'est un GridPane 2x1 à l'intérieur du JavaFX AnchorPane par défaut, j'ai ajouté deux exemples de boutons au volet de la grille.

<AnchorPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" > 
<children> 
    <GridPane prefHeight="300.0" prefWidth="400.0"> 
     <columnConstraints> 
      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
     </columnConstraints> 
     <rowConstraints> 
      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
     </rowConstraints> 
     <children> 
      <Button fx:id="example1" mnemonicParsing="false" text="Example 2" GridPane.halignment="CENTER" GridPane.valignment="CENTER" /> 
      <Button fx:id="example2" mnemonicParsing="false" text="Example 2" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" /> 
     </children> 
    </GridPane> 
</children> 

Ce code est joli dans un écran 400x300 (Trop peu, je sais, il est juste un exemple), quand je l'échelle à 1366x768 (pas vrai plein écran, juste stage.setMaximized(true);), le GridPane n'est pas à l'échelle, seulement la scène elle-même, donc j'ai un fond d'écran plein, avec un volet de 400x300 (avec ses minuscules boutons) dans le coin supérieur gauche de mon écran.

TL; DR: L'exemple de code les boutons restent dans le coin supérieur gauche de l'écran, et le reste est juste un espace vide lorsque j'agrandis la résolution.

Mise à jour 2; J'ai oublié le code Java.

Parent root = FXMLLoader.load(getClass().getResource("UI.fxml")); 
Scene scene = new Scene(root, java.awt.Toolkit.getDefaultToolkit().getScreenSize().width, 
      java.awt.Toolkit.getDefaultToolkit().getScreenSize().height); 
stage = new Stage(); 
stage.setMaximized(false); 
stage.setScene(scene); 
stage.setTitle("Example Menu"); 
stage.show(); 
+0

J'ai peur qu'il soit impossible d'aider sans voir du code. Cela ressemble à un problème de mise en page, peut-être des positions ou des tailles codées en dur. Avez-vous lu les commentaires sur la question liée? Semble être un problème similaire. –

+0

Je n'ai rien codé en dur. J'ai tout fait avec 'JavaFX SceneBuilder 2', et quand on regarde la taille, tout (Min, pref et max) dit' USE_COMPUTED_SIZE'.Je comprends qu'il est difficile d'aider sans voir le code, mais si je mets le code en ligne, je pourrais me faire virer, et je ne le veux pas, désolé. Merci d'essayer d'aider :) – Tuzane

+0

Je vois, mais peut-être que vous pouvez coder un petit exemple autonome qui n'est pas lié à votre travail? Juste un écran simple avec un ou deux composants pour simuler le problème? –

Répondre

2

Vous devez définir les contraintes du volet d'ancrage sur l'enfant. dans votre cas gridpane

AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" 

Ce sera après votre

GridPane prefHeight="300.0" prefWidth="400.0" **HERE** 

Cela permettra de maximiser le composant de l'enfant dans le conteneur, d'où 0 0 0 0 pixels de chaque côté.

+1

Vous ne pouvez même pas imaginer combien je vous aime en ce moment :) Cela a fonctionné parfaitement pour le petit exemple. – Tuzane

+0

Je devine que j'ai besoin d'ajouter ce code à chaque panneau dans le projet actuel pour que tous les éléments soient mis à l'échelle, non? Par exemple, si j'ai un bouton dans un GridPane, j'ajouterais GridPane.leftAnchor = "0,0" ... et le reste à l'élément Button. Est-ce correct? – Tuzane

+1

Le volet d'ancrage bien fonctionne comme ancre, quand vous mettez des enfants là-dedans, sa pile codée en dur. Si vous maximisez la fenêtre par exemple sur une résolution plus élevée alors vous vous préparez, dans une position plus précise. , donc ça a l'air bizarre si vous le mettez à l'échelle il restera juste statique à ce pixel dans le parent. –