Позиционирование JFrame

276
28 февраля 2018, 08:46

Проблема такая:
Установлена Windows 10
Имеется экран 1920x1080 px
По умолчанию windows ставит zoom 125% = 120dpi для этого разрешения (ну да и бог с ним)
Zoom 125% делает экран 1536x864 px
Приложение держится на Java 9 - JavaFX + Swing

Я вывожу на экран два фрейма одинаковых размеров по обеим сторонам на верху и вот такая вот картина:

Для обоих фреймов (может важно):

setAlwaysOnTop(true);
setSize(500, 252);

Устанавливаю для frameRight:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice defaultScreen = ge.getDefaultScreenDevice();
Rectangle rect = defaultScreen.getDefaultConfiguration().getBounds();
int x = (int) rect.getMaxX() - frameRight.getWidth();
jframe.setLocation(x, 0);

Как видите остается пространство и фрейм не доходит до конца.

Причем со 100% zoom = 80dpi естественно все норм.
Я уже пробовал что-то типа:

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
for (int i = 0; i < dim.width; i++) {
    if (frameRight.getLocation().x + frameRight.getWidth() == dim.width) {
        log.info(frameRight.getLocation().x + frameRight.getWidth() + "==" +  dim.width);
        break;
    }
    frameRight.setLocation(i, 0);
}

Ну чтобы посмотреть лог, но все очевидно 1536==1536
...и многое другое, но никак не могу понять как вычислить это пространство и минусануть его при позиционировании?

Ну и:

getLocation() = java.awt.Point[x=1036,y=0]
getLocationOnScreen() = java.awt.Point[x=1036,y=0]

По сути это получается просто медиум-математическая задача. Фреймы остаются неизменными при zoom-е, т.е. они по отношению к экрану - уменьшаются. Осталось вычислить их реальный размер на экране (так как getWith() выдает то, что в setSize(?,?)) и на сколько они увеличиваются при зуме. Но ведь увеличивается то весь экран, а не фреймы по отдельности. Поэтому задача для меня встала...

27.02.18
Поигрался руками и вот что получилось простым перебором чисел:

Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
if (screen.width == 1920) {
    // 100% минус 500px
    setLocation(screen.width - getWidth(), 0);
} else
if (screen.width == 1536) {
    // 125% минус 600px
    setLocation(screen.width - getWidth() + getWidth() / 100 * (dpi - 100), 0);
} else
if (screen.width == 1280) {
    // 150% минус 667px
    setLocation(screen.width - getWidth() + getWidth() / 100 * (dpi - 87) + 2, 0);
} else
if (screen.width == 1098) {
    // 175% минус 712px
    setLocation(screen.width - getWidth() + getWidth() / 100 * (dpi - 78) + 2, 0);
}

Но это все только для моего экрана, а для других опять будет возня с перебором чисел...

READ ALSO
Объясните код if __name__ == &ldquo;__main__&rdquo; в терминах языка Java

Объясните код if __name__ == “__main__” в терминах языка Java

Я новичок в Python и стараюсь понять все через язык, который знаю, - через JavaНаткнувшись на if __name__ == "__main__", впал в ступор

224
API или Прямое подключение ?

API или Прямое подключение ?

Всем привет! Делаю первое Андроид приложение и задался вопросом как лучше реализовывать подключение к базе данных ?? Написать свое апи на стороне...

247
Как отключить слайдинг

Как отключить слайдинг

Всем день добрыйИспользую ViewPager и TabLayout в связке

259
Полиморфные методы VS поллиморфный instanceof

Полиморфные методы VS поллиморфный instanceof

При написании кода столкнулся с вопросом: а что же все таки быстрее? Набросал тест:

208