2016-04-06 6 views
0

Ich versuche, einige Schriftarten in meiner Java Swing-Anwendung manuell zu skalieren (dh für einen hochauflösenden Bildschirm).(DPI) Skalierung von Schriftarten in Java Swing (und Windows)

bei 96 DPI (100%), sagt mir Windows Look & Spüren Sie die Standard-Schriftart ist Tahoma Größe 11. Bei 200% (Label.font in der WLF verwenden) es 21 ist, 300% 32 ist, 400% ist 43 und 500% ist 53. (diese Punktgröße beachten == Schrift Aufstieg)

Mein ursprünglicher Ansatz ist „mein“ Standardschriftart zu nehmen: Tahoma Größe 11. Dann berechnen Sie den Skalierungsfaktor (zB 2.0 für 200%.). Von dort aus möchte ich die Schriftpunktgröße berechnen, aber eine gerade Multiplikations tun, ist nicht im Einklang mit der Windows-Skalierung,

so die Frage (n):

  1. Wie funktioniert Schriftskalierung Arbeit in Windows? und
  2. Wie skaliere ich meine Schriftarten? (Es gibt auch eine andere Skalierung für Komponenten usw.) Die beiden Hauptschriftarten in meiner Anwendung sind Tahoma (11) und Segoe UI (12).

    new WindowsLookAndFeel().getDefaults().getFont("Label.font") //returns 11 @ 100% 
    
    Font font = StyleContext.getDefaultStyleContext().getFont("Tahoma", Font.PLAIN, 11); //my inital Composite font (Tahoma with Dialog fallback) 
    
    Font newFont = font.deriveFont(zoomFactor * 11); // this gets me 22 @ 200% 
    

Dank!

+0

Warum nicht Java fragen, was die zugrunde liegenden dpi sind? Wenn Sie versuchen, High-dpi-Displays zu kompensieren, nehmen Sie das Tahoma auf '11'px pro' 96' dpi und skalieren Sie es auf '11 * [real]/96' px per' [real] 'dpi –

+0

Hey danke Für deinen Kommentar. Ich mache genau das, ich berechne den Zoomfaktor, indem ich die dpi frage (am besten kann ich) und dividiere durch 96 (dh 100%). Das Problem ist, dass @ 192 dpi, Windows Look and Feel sagt mir Tahoma ist in Größe 21. Wenn ich die Zoom * 11 Berechnung mache, erhält man stattdessen Punktgröße 22 (11 * 192/96) –

+0

Das klingt eigentlich nicht wie ein Problem so sehr als eine Folge der Punktabrundung. "11px" ist möglicherweise kein echter Pixelwert, sondern eine Pixelrepräsentation eines (gebrochenen) 'pt'-Wertes. In diesem Fall kann 21px bei 192dpi leicht auf einen' floor (...) 'des Konvertierungsergebnisses zurückzuführen sein von 'pt' nach' px'. An diesem Punkt müssen Sie möglicherweise wissen, mit welcher Textformatierung Sie arbeiten (GDI, GDI +, DirectWrite?), Oder legen Sie die Schriftgröße basierend auf den Abmessungen des Containers fest, der benötigt wird. –

Antwort

1

In meinem Fall war meine Lösung, jede Schriftgröße zu durchlaufen und die Breite einer Testzeichenfolge zu überprüfen und bei der Schriftart zu stoppen, die der skalierten Breite am nächsten kommt (aber nicht größer ist).

Dies entspricht der Größenanpassung einer Schriftart an die Größe einer bestimmten Komponente. Eine Sache zu beachten ist, dass ich eine relativ lange Zeichenfolge für die Test-Zeichenfolge auswählen musste.

Mit dieser Methode wird Tahoma 21 für die richtige Schriftart mit 200% (192 DPI) ausgewählt. Etwas in der Art von:

while(true) { 

     Font newFont = font.deriveFont((float)fontSize + 1); 
     int newWidth = StyleContext.getDefaultStyleContext().getFontMetrics(newFont).stringWidth(TEST_STIRNG); 
     if(newWidth <= targetWidth) { 
      fontSize++; 
     } else { 
      System.out.println("Rejected Font:" + newFont.getName() + " size:" + newFont.getSize() + " width: " + newWidth);   
      break; 
     } 
    }