2016-04-07 13 views
5

Ich habe nach einer Methode gesucht, dies zu tun, aber ich fand nur This question without answers.JavaFX Bildschirmauflösung Skalierung

Ich entwickle in einem 1366x768 Laptop, ich benutze JavaFX, um eine GUI zu erstellen (Es tut mir leid, aber ich kann den Code nicht posten, es ist im Grunde ein AnchorPane mit ein paar GridPanes, die mehr GridPanes enthalten, die Labels enthalten , TextFields und ein paar Charts).

Das Problem kommt, wenn ich das Projekt auf eine andere Auflösung (1920x1080 oder 1600x900) laden.

Ich benutze stage.setMaximized(true);, aber dies skaliert nur den Hintergrund, die Bühne selbst, so dass alle Elemente und Container (Panels, Labels, TextFields .....) bleiben die gleiche Größe wie mit der Auflösung 1366x768, so dass die GUI "nicht passen" bei Auflösungen, die nicht genau 1366x768 sind.

Ich hoffe, ich habe mein Problem gut genug erklärt, mein Englisch ist weit davon entfernt, perfekt zu sein.

Hat jemand einen Vorschlag, wie man Elemente mit Bühnenauflösung skalieren kann?

(Ich brauche die Software maximiert oder Vollbild in jedem Monitor, so eine feste Auflösung (1366x768, zum Beispiel) scheint nicht wie eine gute Lösung).

Danke euch allen.

Update:

Ich habe nur ein kleines Beispiel. Es ist ein 2x1 GridPane innerhalb des Standard JavaFX AnchorPane, ich habe zwei Beispiel Buttons zum Grid Bereich hinzugefügt.

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

Dieser Code sieht schön in einem 400x300 Bildschirm (zu wenig, ich weiß, es ist nur ein Beispiel), wenn ich es auf 1366x768 skalieren (nicht wirklich Vollbild, nur stage.setMaximized(true);), die GridPane skaliert nicht, nur die Bühne selbst, also habe ich einen Vollbildhintergrund mit einem 400x300 Pane (mit seinen kleinen Buttons) in der oberen linken Ecke meines Bildschirms.

TL; DR: Der Beispielcode die Schaltflächen bleiben in der oberen linken Ecke des Bildschirms, und der Rest ist nur ein leerer Raum, wenn ich die Auflösung skalieren.

Update 2; Den Java-Code vergessen.

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

Ich fürchte, es ist unmöglich zu helfen, ohne etwas Code zu sehen. Klingt wie ein Layout-Problem, vielleicht hart codierte Positionen oder Größen. Hast du die Kommentare zu der verknüpften Frage gelesen? Scheint ein ähnliches Problem zu sein. –

+0

Ich habe nichts hart codiert. Ich habe alles mit 'JavaFX SceneBuilder 2' gemacht, und wenn man die Größe betrachtet, sagt alles (Min, Pref und Max)' USE_COMPUTED_SIZE'.Ich verstehe, dass es schwer ist, zu helfen, ohne den Code zu sehen, aber wenn ich den Code online stelle, könnte ich gefeuert werden, und das will ich nicht, Entschuldigung. Danke, dass Sie versucht haben zu helfen :) – Tuzane

+0

Ich sehe, aber vielleicht können Sie ein kleines, in sich geschlossenes Beispiel programmieren, das nicht mit Ihrer Arbeit zusammenhängt? Nur ein einfacher Bildschirm mit ein oder zwei Komponenten, um das Problem zu simulieren? –

Antwort

2

Sie müssen Ankerbereichsbeschränkungen für Kind festlegen. in Ihrem Fall gridpane

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

Dies geht nach dem

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

Dies wird Kinderkomponente innerhalb des Behälters zu maximieren, also 0 0 0 0 Pixel von jeder Seite.

+1

Du kannst dir nicht vorstellen, wie sehr ich dich jetzt liebe :) Das hat perfekt für das kleine Beispiel funktioniert. – Tuzane

+0

Ich vermute, dass ich diesen Code zu jedem Panel im eigentlichen Projekt hinzufügen muss, um alle Elemente skalieren zu lassen, oder? Wenn ich zum Beispiel eine Schaltfläche in einem GridPane habe, würde ich GridPane.leftAnchor = "0,0" ... und den Rest zum Button-Element hinzufügen. Ist das in Ordnung? – Tuzane

+1

Gut verankerter Bereich funktioniert wie Anker, wenn du Kinder hineinlegst, seine hartcodierte Position. Wenn du beispielsweise Fenster mit höherer Auflösung maximierst, dann hast du dich darauf vorbereitet, in deinem Screambuilder, wo es gut aussieht, weiß es nichts anderes als diese fest codierte Position , so sieht es seltsam aus, wenn man es skaliert, bleibt es statisch bei diesem Pixel innerhalb des Elternteils. –