概要
ディスプレイの解像度の設定によってパネルの初期サイズ、フォントサイズ、行の高さなどを変更するテストを行います。
Screenshot
Advertisement
サンプルコード
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
のサイズ、JTable
、JTree
のフォントサイズや行の高さを変更するテストしています。
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()
などは未調査
参考リンク
- Toolkit#getScreenResolution() (Java Platform SE 8)
- UIManagerで使用するFontを統一
- JEP 263: HiDPI Graphics on Windows and Linux
- JDK-8055212 JEP 263: HiDPI Graphics on Windows and Linux - Java Bug System
- JDK-8147440 HiDPI (Windows): Swing components have incorrect sizes after changing display resolution - Java Bug System
- JDK-8174845 Bad scaling on Windows with large fonts with Java 9ea - Java Bug System
- JDK-8176883 Enable antialiasing for Metal L&F icons on HiDPI display - Java Bug System
- windows 10 - How do I run Java apps upscaled on a high-DPI display? - Super User