UI Scale

washpuda54

Mitglied
Hallo ich habe folgendes Problem und hoffe mir kann jemand helfen. Ich schreibe gerade ein kleines Programm und nutze Swing als Benutzeroberfläche, möchte aber von JavaFX den Dateidialog verwenden.

Unter Windows 10 lässt sich ja über anpassen die Größe von Text Apps etc. verändern zum Beispiel 125% 150% usw. Wenn ich mein Programm mit Jar2Exe in eine Excel konvertieren und diese dann ausführe, wird die Größeneinstellung von Windows auch berücksichtigt, daher Texte und die kleinen Icons in den Schaltflächen werden entsprechend größer dargestellt.

Um den Dateiauswahldialog von Java FX zu verwenden muss ich den Befehl PlatformImpl.startup(() -> {}); ausführen, damit das Toolkit initialisiert wird. Dies skaliert jedoch augenblicklich das Programmfenster inklusive aller Texte und Icons auf die Größe, wie es unter Windows bei einer Prozent 100% Größeneinstellung angezeigt werden würde. Alles weitere wird wie gehabt. Ich habe hier schon eine Menge recherchiert bin aber leider nicht fündig geworden. Vielleicht hat jemand ja eine Idee und kann mir hier weiterhelfen.

Vielen Dank voraus.
 

washpuda54

Mitglied
Das Programm wird dann von vornherein klein dargestellt, zumindest wird nicht mehr mitten im Programmablauf beim Öffnen des Dialogs skaliert (was schon mal sehr viel Wert ist, danke). Auf den meisten Monitoren ist es ja kein Problem aber sobald UHD ins spiel kommt wirkt alles sehr klein. Hier muss es doch eine Einstellmöglichkeit durch setzen einer Property geben.
 

dzim

Top Contributor
Such mal nach "hidpi", "dpi scaling", "render scale" - am Besten immer mit dem Zusatz "swing" oder "swing javafx interop" (da du ja die interoperability ausnutzt).
Ich verstehe noch nicht ganz, warum du überhaupt eine Swing-Anwendung baust, wenn du JavaFX kennst. Würde das glatt umbauen, wenn du nicht schon zu weit bist.
Übrigens wird dein PlatformImpl-Aufruf unter Java9 nicht mehr gehen! Das ist Private API und sollte, wenn möglich, vermieden werden.
Der etwas bessere (wenn auch vom Code her unter Umständen nach etwas "umfangreichere") Weg wird hier beschrieben: http://stackoverflow.com/questions/11273773/javafx-2-1-toolkit-not-initialized
 

washpuda54

Mitglied
Danke für die ausführliche Antwort. Ich hab schon mal nach den Schlagwörtern gesucht, bin hier auch nicht richtig fündig geworden. Hier muss ja sehr viel individuell angepasst werden und bereits festgelegte Schriftgrößen können z. B. nicht global geändert werden.

Wenn ich meinem Programm mit Jar2Exe als exe konvertiert starte, wird alles korrekt gemäß der Windowseinstellung skaliert (Als wenn das Fenster gleichmäßig vergrößert wird). Beim Start über Eclipse oder Konvertiert mit Launch4J erfolgt keine Skalierung. Jeder Anwender hat ja eigene Vorlieben und Windows skaliert es ja automatisch bei Displays mit vielen DPIs auf ein vernünftiges Maß. Um es eigenhändig zu skalieren müsste man ja auch die Skalierungseinstellung von Windows kennen.

Da der PlatformImpl-Aufruf sofort auf die unskalierte Ansicht wechselt (ohne Grafikfehler) muss es doch irgendwo gesetzt werden. Genauso leicht sollte es sich ja zurücksetzen lassen. Und genau dass suche ich.

Das Programm ist schon sehr weit und ich wüsste nicht wie ich das nachträglich auf JavaFX ändern könnte. Derzeit sehe ich auch kein Grund. Swing insbesondere das Nimbus LaF ist sehr schön und umfassend. Lediglich der JFileChooser ist schwer zu bedienen, insbesondere mit einem Tablet, weshalb ich den FileChooser von Java FX verwenden möchte. Der FileDialog von awt gefällt mir auch sehr gut, jedoch kann ich hier keine Verzeichnisse wählen, was ich manchmal brauche.

Dein Link werde ich mir in der nächsten Woche etwas genauer anschauen, denke aber das es auf das gleiche hinausläuft. Ursprünglich hatte ich auch ein JFXPanel verwendet. Um den Fehler einzukreisen habe ich den Aufrauf bis zum PlatfomImpl reduziert. Der Aufruf ist erforderlich, um das Toolkit zu initialisieren.
 

dzim

Top Contributor
Schon klar. Wie ich schon sagte: "Würde das glatt umbauen, wenn du nicht schon zu weit bist." ;) Da du offensichtlich schon zu weit bist, ist das irrelevant für dich.
Bei JavaFX kümmert sich unter Windows und Mac die zugrundeliegende Technik darum, das eigentlich immer das mehr oder weniger korrekte Scaling verwendet wird. Ich vermute mal, dadurch, dass du es erst später initialisierst, wird da irgendein Code nicht korrekt aufgerufen (sprich: Bug in JavaFX!).

Hier mal übrigens etwas Lektüre zum Scaling. Wie gesagt: man findet mehr unter den genannten Stichworten, wenn man sie mit JavaFX kombiniert.
http://news.kynosarges.org/2013/08/09/javafx-dpi-scaling/
http://news.kynosarges.org/2015/06/29/javafx-dpi-scaling-fixed/
http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-June/017337.html
 

Ähnliche Java Themen

Neue Themen


Oben