2016-04-07 38 views
5

Ho cercato un metodo per farlo, ma ho trovato solo This question without answers.Ridimensionamento della risoluzione dello schermo JavaFX

Sto sviluppando in un laptop 1366x768, uso JavaFX per creare una GUI (mi dispiace, ma non posso pubblicare il codice, è fondamentalmente un AnchorPane contenente un paio di GridPanes, che contengono più GridPanes, che contengono etichette , Campi di testo e un paio di grafici).

Il problema si presenta quando carico il progetto su un'altra risoluzione (1920x1080 o 1600x900).

Sto usando stage.setMaximized(true);, ma questo solo scala lo sfondo, lo stadio stesso, quindi tutti gli elementi e contenitori (pannelli, etichette, campi di testo .....) rimangono le stesse dimensioni con la risoluzione 1366x768, rendendo La GUI "non si adatta" a risoluzioni che non sono esattamente 1366x768.

Spero di aver spiegato abbastanza bene il mio problema, il mio inglese è tutt'altro che perfetto.

Qualcuno ha qualche suggerimento su come rendere gli elementi in scala con la risoluzione dello stage?

(Ho bisogno che il software sia ingrandito o schermo intero in ogni monitor, quindi fare una risoluzione fissa (1366x768, per esempio) non sembra una buona soluzione).

Grazie a tutti.

Aggiornamento:

Ho appena creato un piccolo esempio. È un GridPane 2x1 dentro l'Ancoraggio JavaFX predefinito, ho aggiunto due pulsanti di esempio al pannello della griglia.

<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> 

Questo codice sembra piacevole in uno schermo 400x300 (Troppo poco, lo so, è solo un esempio), quando mi scala a 1366x768 (schermo intero non è reale, solo stage.setMaximized(true);), il GridPane non scala, solo lo stage stesso, quindi ho uno sfondo a schermo intero, con un riquadro 400x300 (con i suoi piccoli pulsanti) nell'angolo in alto a sinistra dello schermo.

TL; DR: Il codice di esempio i pulsanti rimangono nell'angolo in alto a sinistra dello schermo e il resto è solo uno spazio vuoto quando aumento la risoluzione.

Aggiornamento 2; Hai dimenticato il codice 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

Ho paura che sia impossibile aiutare senza vedere un codice. Sembra un problema di layout, forse posizioni o dimensioni hard-coded. Hai letto i commenti sulla domanda collegata? Sembra essere un problema simile. –

+0

Non ho codificato nulla. Ho fatto tutto con 'JavaFX SceneBuilder 2', e quando guardo le dimensioni, tutto (Min, pref e max) dice' USE_COMPUTED_SIZE'.Capisco che sia difficile aiutare senza vedere il codice, ma se inserisco il codice online potrei essere licenziato, e non lo voglio, mi dispiace. Grazie per aver cercato di aiutare :) – Tuzane

+0

Vedo, ma forse puoi codificare un piccolo esempio autonomo che non è correlato al tuo lavoro? Basta una semplice schermata con uno o due componenti per simulare il problema? –

risposta

2

È necessario impostare i vincoli del riquadro di ancoraggio sul figlio. nel caso gridpane

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

Questo andrà secondo componente bambini

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

Ciò consentirà di massimizzare all'interno del contenitore, quindi 0 0 0 0 pixel da ogni lato.

+1

Non puoi nemmeno immaginare quanto ti amo adesso :) Questo ha funzionato perfettamente per il piccolo esempio. – Tuzane

+0

Suppongo di dover aggiungere questo codice a ogni pannello del progetto per far sì che tutti gli elementi vengano ridimensionati, giusto? Ad esempio, se ho un pulsante in una GridPane, aggiungere GridPane.leftAnchor = "0,0" ... e il resto all'elemento Button. È ok? – Tuzane

+1

Il riquadro di ancoraggio buono funziona come l'ancora, quando si mettono i bambini lì dentro, la sua posizione hardcoded. Se si massimizza la finestra ad esempio su una risoluzione più alta, allora si è preparato, in yoru scenebuidler dove sembrava a posto, non conosce nient'altro che quella posizione codificata , quindi sembra strano se lo ridimensioni rimarrà statico a quel pixel all'interno del genitore. –