2013-03-27 5 views
59

Wenn Sie einen Monitor mit einer DPI über 150 (wie Macbook Pro) haben, können Sie auch das Problem finden: die Schriftart auf der Java Swing App ist zu klein für High DPI Monitor, und ich kann nicht ändern Schriftgröße überhaupt (Es ignoriert die Windows DPI direkt, nur Anzeige der sehr ursprünglichen DPI -> 96). Ich kann nichts anderes machen, als die Bildschirmauflösung zu ändern, was alles auf LCD verschwommen machen könnte.Wie setze ich die DPI von Java Swing Apps unter Windows/Linux?

Ja, ich habe einen Laptop mit einem hohen DPI-Monitor, 15,6 'mit 1920x1080 Auflösung, einige Java-Desktop-Anwendungen sehen sehr klein auf meinem Laptop, wie Matlab, Burpsuite usw. Ich habe im Internet nach einem sehr sehr gesucht lange Zeit, kann aber immer noch keine Methode für das Problem finden. Ich weiß, dass ich die JRE-Fonts durch JRE_HOME/lib/font/fontconfig.properties.src ändern kann, aber ich kann keinen Ort finden, um die Standardschriftgröße oder DPI für Java-Desktop-Schriftarten festzulegen.

Hat das Problem keine Lösung? Haben Sie einen hohen DPI-Monitor? Wie geht es Ihnen mit solchen Apps? Gibt Swing DPI-Benutzer auf?

+3

[Dies] (http://stackoverflow.com/questions/1102216/can-i-set-the-dpi-resolution-of-my-javs-swing-application-wit- changing-the-s) könnte help you – Parth

+0

Und [sagen Sie uns Ihre Ergebnisse] (http://meta.stackexchange.com/q/17463/163188), so dass wir wissen, wie eifersüchtig zu sein. :-) – trashgod

+0

Off-topic: Wenn normale Windows-Programme nicht gut skalieren, auch wenn Sie in den Kompatibilitätsoptionen das Flag "keine DPI-Skalierung" angeben, wird wahrscheinlich eine 64-Bit-Version des Programms ausgeführt. Versuchen Sie stattdessen die 32-Bit-Version. –

Antwort

35

Ich untersuche dieses Problem derzeit unter Windows. Hier ist, was ich gefunden habe:

Most Swing Look & Feels unterstützen überhaupt nicht hohe DPI, nicht einmal Nimbus, obwohl es skalierbar sein soll. Ich habe einige alte Blogposts gefunden, die besagen, dass Nimbus möglicherweise eine Skalierung mit hohem DPI bietet, aber anscheinend ist das nie passiert.

Die einzige Ausnahme ist System LAF, aber die Standardschriftart ist ~ 10% kleiner als die tatsächliche Systemschriftgröße bei allen DPI-Einstellungen. Darüber hinaus muss System explizit wie hier beschrieben ausgewählt werden: http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

Es gibt keinen einzigen Skalierungsfaktor, den Sie auch in Swing einstellen könnten. Der spezifische LAF muss Code zur Verfügung stellen, um die Skalierung zu handhaben. Das Beste, was Sie tun können, ist System auszuwählen und zu hoffen, dass es gut genug ist.

Allerdings skaliert JavaFX korrekt und automatisch bis zu 150% auf meinem System. Wenn möglich, schlage ich vor, dass Sie JavaFX verwenden, um Ihre GUI zu erstellen.

edit: Ich habe ein paar kleine Testprogramme erstellt und Vergleichs-Screenshots für verschiedene GUI-Frameworks, Swing-Themes und DPI-Einstellungen erstellt. Dies könnte informativ für Leute sein, die diese Frage lesen: http://kynosarges.org/GuiDpiScaling.html

4

Auf Linux scheint es nicht möglich zu Skalierung mit einem Swing Look and Feel, nach meinen Experimenten. Es ist jedoch möglich, dies mit Hilfe eines Hacks mit VNC, vncdesk, zu tun. Hier ist meine Konfiguration für gradle --gui unter vncdesk ausgeführt wird:

.vncdesk/1/settings.ini:

[desktop] 
width = 1050 
height = 650 

[window] 
title = gradle 
name = gradle in vncdesk 
class = GradleInVncdesk 
scale_factor = 2 

.vncdesk/1/startup:

#!/bin/sh 
cd "$INVOCATION_DIR" 
matchbox-window-manager& 
exec gradle --gui "[email protected]" 
+0

Der minimale 'matchbox-window-manager' ist in diesem Fall perfekt. – Qdeep

2

Ich schaffte es diese Anweisungen folgen zu lösen: Link.

Es ist auf Deutsch, aber ich werde die wichtigen Sachen übersetzen.

Erstellen Sie diesen Registrierungsschlüssel:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide] 
"PreferExternalManifest"=dword:00000001 

erstellen Manifest-Datei mit folgendem Inhalt:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> 

<dependency> 
    <dependentAssembly> 
    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"> 
    </assemblyIdentity> 
    </dependentAssembly> 
</dependency> 

<dependency> 
    <dependentAssembly> 
    <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"> 
    </assemblyIdentity> 
    </dependentAssembly> 
</dependency> 

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
    <requestedPrivileges> 
     <requestedExecutionLevel level="asInvoker" uiAccess="false"/> 
    </requestedPrivileges> 
    </security> 
</trustInfo> 

<asmv3:application> 
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
    <ms_windowsSettings:dpiAware xmlns:ms_windowsSettings="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</ms_windowsSettings:dpiAware> 
    </asmv3:windowsSettings> 
</asmv3:application> 

</assembly> 

es in das bin-Verzeichnis kopieren, in dem die java.exe und javaw.exe innen und benannte es java.exe.manifest und javaw.exe.manifest (Sie haben zwei Dateien mit dem gleichen Inhalt aber unterschiedlichen Namen).

HTH.

Bernd

+0

Leider schien das für mich nichts zu ändern. Ich lief 32 Bit Java, nicht, dass mir bewusst ist, dass ich eine Wahl hatte, wenn das einen Unterschied macht. EDIT: In der Tat kann das Problem gelöst werden, zumindest in meinem Fall, indem Sie ein Manifest für die einzelne Anwendung, die ein Problem ist, anstatt java/javaw.exe erstellen. Per http://javahacker.com/eclipse-on-a-high-dpi-display-in-windows/ –

+1

@AlexWhittemore Nachdem ich den verlinkten Artikel gelesen habe, muss ich sagen, dass es genau das ist, was es rät - zu erstellen ' .exe.manifest' Datei zum Deaktivieren der DPI-Skalierung. Anders als das, was Eferrari gesagt hat. – user8

+0

@ user8 Ich habe nie nachgefolgt, aber ja, der Link sagt, dass, gute Fang;) –

4

Kurze Antwort: Sie müssen es auf JRE laufen 9.

Lange Antwort:
Das ist, weil der Java-Runtime selbst erklärt „DPI-bewusst“ zu sein, aber nicht wirklich unterstützte es für AWT und Swing. Java-Anwendungen wurden auf der Grundlage von Pixeln skaliert und gerendert, anstatt dass sie richtig skaliert wurden, einschließlich HiDPI-Anzeigen. Wie auch immer, das wurde kürzlich gelöst. Siehe die Ausgabe JEP 263: HiDPI Graphics on Windows and Linux und die upgrade.

Also, die Erhöhung der Schriftgröße funktioniert nicht (weil es den Rest der Dinge nicht erhöht); das jvm-Argument -Dsun.java2d.dpiaware=false funktioniert nicht (weil es nicht wirklich unterstützt wird); und die Manifestdatei + Registry-Bearbeitung (für Windows) funktioniert einfach nicht.

Lösung: Sie müssen es auf JRE 9 ausführen, da es diese Funktion wirklich unterstützt.

+0

In Java8 wurde mir geholfen, indem Sie den dpiAware Parameter in der Manifest-Datei javaw.exe wechseln – MisterParser

Verwandte Themen