2016-04-06 18 views
0

Java Swingアプリケーションで高解像度の画面用のフォントを手動で拡大しようとしています。 96 DPI(100%)で(DPI)Java Swing(およびWindows)のフォントのスケーリング

、Windowsのルック&フィールはデフォルトのフォントは200%でのTahomaサイズ11(WLFにLabel.fontを使用して) であることは、300%は32で、21だ400%である私に語りました

私の独自のアプローチは、「私の」デフォルトのフォントであるTahomaサイズ11を使用することです。スケーリング係数(つまり、200%の場合は2.0)を計算します。 )。そこから私はしかし、まっすぐ乗算をやって、フォントのポイントサイズを計算したいのは、

Windowsのスケーリングに沿ったものではありませんので、質問(複数可):

  1. どのようにフォントのスケーリング作業を行いますWindows? と
  2. フォントの縮尺を変更するにはどうすればよいですか? (その他のコンポーネントのスケーリングもあります) 私のアプリケーションの主なフォントは、Tahoma(11)と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% 
    

ありがとう!

+0

根底にあるdpiが何であるかJavaに質問してみませんか? high-dpiディスプレイを補正しようとしている場合は、Tahomaを '' '' '96'dpiごとに' '11'pxにして、[実際の]' dpiあたりに '11 * [real]/96'pxにスケールしてください。 –

+0

あなたのコメントのために。私はちょうどこれをやっている、私はdpiを(最高私ができる)と96で割る(つまり100%)を求めることによってズーム係数を計算します。問題は、@ 192 dpi、Windows Look and FeelがTahomaのサイズが21であることを教えてくれることです。ズーム* 11の計算をするとポイントサイズが22になります(11 * 192/96) –

+0

実際には聞こえません点の丸めの結果としての問題。 '11px'は実際に真のピクセル値ではなく、(小数)' pt '値のピクセル表現であるかもしれません。その場合、192dpiの21pxは変換結果の 'floor(...)' 'pt'から' px'までです。その時点で、あなたが扱っているテキストシェーパ(GDI、GDI +、DirectWrite?)を知る必要があるかもしれません。あるいは、最終的に必要なコンテナの寸法に基づいてフォントサイズを設定する必要があります。 –

答えて

1

私の解決方法は、各フォントサイズを繰り返し、テスト文字列の幅を確認し、スケールされた幅のサイズに最も近い(しかしそれ以下)フォントで停止することでした。

これは、特定のコンポーネントのサイズにフォントをサイジングするのと同じです。私がTest文字列のために比較的長い文字列を選択しなければならないことに注意するべき1つのことがあります。

この方法に従うと、Tahoma 21が正しいフォントの200%(192 DPI)に選ばれます。

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; 
     } 
    } 
関連する問題