Swing/ScreenResolution のバックアップ差分(No.9)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/ScreenResolution へ行く。
- 1 (2015-03-09 (月) 09:59:50)
- 2 (2015-03-09 (月) 14:46:39)
- 3 (2015-06-10 (水) 02:46:32)
- 4 (2016-06-30 (木) 18:43:58)
- 5 (2017-02-09 (木) 13:57:37)
- 6 (2017-04-04 (火) 14:13:45)
- 7 (2017-05-01 (月) 21:44:15)
- 8 (2017-11-25 (土) 17:31:22)
- 9 (2017-12-06 (水) 13:10:21)
- 10 (2017-12-07 (木) 11:42:49)
- 11 (2019-11-13 (水) 19:52:35)
- 12 (2020-09-15 (火) 22:23:19)
- 13 (2022-04-22 (金) 06:30:27)
- 14 (2022-08-20 (土) 22:15:25)
- 追加された行はこの色です。
- 削除された行はこの色です。
---
category: swing
folder: ScreenResolution
title: ToolkitからScreenResolutionを取得し、コンポーネントで使用するフォントの倍率を変更する
tags: [Toolkit, UIManager, Font, JPanel, JTree, JTable]
author: aterai
pubdate: 2015-03-09T09:59:02+09:00
description: ディスプレイの解像度の設定によってパネルの初期サイズ、フォントサイズ、行の高さなどを変更するテストを行います。
image: https://lh3.googleusercontent.com/-Ckc4ZMaD6-8/VPzorX2t8MI/AAAAAAAAN0A/XSE6tpiT92A/s800/ScreenResolution.png
---
* 概要 [#summary]
ディスプレイの解像度の設定によってパネルの初期サイズ、フォントサイズ、行の高さなどを変更するテストを行います。
#download(https://lh3.googleusercontent.com/-Ckc4ZMaD6-8/VPzorX2t8MI/AAAAAAAAN0A/XSE6tpiT92A/s800/ScreenResolution.png)
* サンプルコード [#sourcecode]
#code(link){{
private Dimension defaultSize = new Dimension(320, 240);
private Dimension preferredSize;
public static float getSizeOfText() {
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 = getSizeOfText();
preferredSize = new Dimension((int) (defaultSize.width * sot),
(int) (defaultSize.height * sot));
}
System.out.println(preferredSize);
return preferredSize;
}
}}
* 解説 [#explanation]
上記のサンプルでは、`Windows`環境で`Smaller-100%`、`Medium-125%`、`Larger-150%`とディスプレイの設定を切り替えて、`ContentPane`のサイズ、`JTable`、`JTree`のフォントサイズや行の高さを変更するテストしています。
- 注: `Java 9`で修正済みで`JDK 1.8.0_XX`にもバックポートされているためこのサンプルは無意味だが、解像度の取得方法のメモとして残しておく
- 例: `Medium-125%`の場合
-- `ContentPane`のサイズを`(320 * 1.25, 240 * 1.25)`の`(400, 300)`になるよう、`getPreferredSize()`をオーバーライド
-- [[UIManagerで使用するFontを統一>Swing/FontChange]]で、すべてのコンポーネントのフォントサイズを元の`1.25`倍に変更
-- `JTree`の行の高さは、`JTree#isFixedRowHeight()`の場合のみ、元の`1.25`倍に変更
-- `JTable`の行の高さは、`LookAndFeel`依存で一定で、フォントサイズを変更しても追従しないので、`table.setRowHeight( (int) (table.getRowHeight() * getSizeOfText() ) );`として、自前で`1.25`倍に変更
#code{{
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()`などは未調査
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Toolkit.html#getScreenResolution-- Toolkit#getScreenResolution() (Java Platform SE 8)]
- [[UIManagerで使用するFontを統一>Swing/FontChange]]
- [https://bugs.openjdk.java.net/browse/JDK-8147440 JDK-8147440 HiDPI (Windows): Swing components have incorrect sizes after changing display resolution - Java Bug System]
- [https://bugs.openjdk.java.net/browse/JDK-8174845 JDK-8174845 Bad scaling on Windows with large fonts with Java 9ea - Java Bug System]
- [https://bugs.openjdk.java.net/browse/JDK-8176883 JDK-8176883 Enable antialiasing for Metal L&F icons on HiDPI display - Java Bug System]
* コメント [#comment]
#comment
#comment