import java.awt.Toolkit;
import java.awt.geom.AffineTransform;
import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import charactermanaj.util.JavaVersionUtils;
/**
* スクリーンのスケールを取得する。
private static final float computeScale;
+ private static final boolean noNeedCheckScaleByReflection;
+
private double scaleX;
private double scaleY;
// (Retinaの場合はシステム側でスケールされるのでアプリ側でスケールする必要はないため)
float dpi = System.getProperty("os.name").startsWith("Windows") ? 96f : resolution;
computeScale = resolution / dpi;
+
+ // Java9以降であればアフィン変換パラメータでスケールを確認できるので
+ // リフレクションを使ったスケールの確認は不要である。
+ noNeedCheckScaleByReflection = JavaVersionUtils.getJavaVersion() >= 9;
}
private ScaleSupport(double scaleX, double scaleY) {
double scaleY = trans.getScaleY();
boolean retina = false;
- if (scaleX == 1 && scaleY == 1) {
+ if (scaleX == 1 && scaleY == 1 && !noNeedCheckScaleByReflection) {
// Java8まではデフォルトのアフィン変換はスクリーンスケールは設定されていないので
- // 等倍を返してきた場合は、グラフィクスデバイスがスケーメメソッドをもっているか
- // リフレクションで確かめる。Mac版のJava8であればスケーメメソッドをもっている。
+ // 等倍を返してきた場合は、グラフィクスデバイスがスケールメソッドをもっているかリフレクションで確かめる。
+ // Mac版のJava8であればスケーメメソッドをもっている。
+ // (Java9以降であれば確認は不要である。)
+ // http://hg.openjdk.java.net/jdk9/client/jdk/file/1089d8a8a6e1/src/java.desktop/macosx/classes/sun/awt/CGraphicsDevice.java
// https://www.programcreek.com/java-api-examples/?code=SensorsINI/jaer/jaer-master/src/net/sf/jaer/graphics/ChipCanvas.java
final GraphicsDevice device = gconf.getDevice();
+ Object scaleObj = null;
try {
- Field field = device.getClass().getDeclaredField("scale");
- field.setAccessible(true);
- Object scaleObj = field.get(device);
-
- if (scaleObj instanceof Number) {
- int scale = ((Number) scaleObj).intValue();
- scaleX = scaleY = scale;
- if (scale >= 2) {
- retina = true;
- }
+ // public methodがあれば、そちらを試す。
+ Method methodGetScaleFactor = device.getClass().getMethod("getScaleFactor");
+ scaleObj = methodGetScaleFactor.invoke(device);
+
+ } catch (Exception ex) {
+ try {
+ // sun.awt.CGraphicsDevice固有の内部フィールドを試す
+ Field field = device.getClass().getDeclaredField("scale");
+ field.setAccessible(true);
+ scaleObj = field.get(device);
+ } catch (Exception ex2) {
+ // 何もしない
+ }
+ }
+ if (scaleObj instanceof Number) {
+ int scale = ((Number) scaleObj).intValue();
+ scaleX = scaleY = scale;
+ if (scale >= 2) {
+ retina = true;
}
- } catch (Exception ignore) {
- // 何もしない
}
}
ScaleSupport inst = new ScaleSupport(scaleX, scaleY);