概要

ディスプレイの解像度の設定によってパネルの初期サイズ、フォントサイズ、行の高さなどを変更するテストを行います。

サンプルコード

private Dimension defaultSize = new Dimension(320, 240);
private Dimension dpiPreferredSize;
public static float getDpiScaling() {
  int sr = Toolkit.getDefaultToolkit().getScreenResolution();
  float dpi = System.getProperty("os.name").startsWith("Windows") ? 96f : 72f;
  return sr / dpi;
}

@Override public Dimension getPreferredSize() {
  if (preferredSize == null) {
    float sot = getDpiScaling();
    dpiPreferredSize= new Dimension((int) (defaultSize.width * sot),
                                    (int) (defaultSize.height * sot));
  }
  setPreferredSize(dpiPreferredSize);
  return dpiPreferredSize;
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、Windows環境でSmaller-100%Medium-125%Larger-150%とディスプレイの設定を切り替えて、ContentPaneのサイズ、JTableJTreeのフォントサイズや行の高さを変更するテストしています。

  • Java 9で修正済みでJDK 1.8.0_102にもバックポートされているためこのサンプルは無意味だが、解像度の取得方法のメモとして残しておく
  • 例: Medium-125%の場合
    • ContentPaneのサイズを(320 * 1.25, 240 * 1.25)(400, 300)になるよう、getPreferredSize()をオーバーライド
    • UIManagerで使用するFontを統一で、すべてのコンポーネントのフォントサイズを元の1.25倍に変更
    • JTreeの行の高さは、JTree#isFixedRowHeight()の場合のみ、元の1.25倍に変更
    • JTableの行の高さは、LookAndFeel依存で一定で、フォントサイズを変更しても追従しないので、table.setRowHeight( (int) (table.getRowHeight() * getSizeOfText() ) );として、自前で1.25倍に変更
      JTable table = new JTable(model) {
        @Override public void updateUI() {
          super.updateUI();
          // @see BasicTableUI#installDefaults()
          // JTable's original row height is 16.  To correctly display the
          // contents on Linux we should have set it to 18, Windows 19 and
          // Solaris 20.  As these values vary so much it's too hard to
          // be backward compatable and try to update the row height, we're
          // therefor NOT going to adjust the row height based on font.  If the
          // developer changes the font, it's there responsability to update
          // the row height.
          setRowHeight((int) (getRowHeight() * getSizeOfText()));
        }
      };
      
  • メモ:
    • Windows環境以外ではテストしていない
    • マルチディスプレイ環境で、解像度の異なる画面に移動する場合は考慮していない
    • Insetsなどは変更していない
    • GraphicsConfiguration#getNormalizingTransform()などは未調査

参考リンク

コメント