Java GUI Разрешение Независимое Масштабирование

StackOverflow https://stackoverflow.com/questions/188046

  •  06-07-2019
  •  | 
  •  

Вопрос

Я работаю над большим унаследованным Java-приложением, для которого важной функцией было автоматическое масштабирование компонентов графического интерфейса на основе разрешения монитора. Мы обновляем JVM, на котором он работает, с 1.4.2 до 1.6, и теперь масштабирование нарушено из-за изменения в реализации java.awt.Container.getPreferredSize ().

getPrefferedSize используется для возврата того же объекта, который вы дали с помощью setPreferredSize () (все также относится к минимальному / максимальному размеру), так что мы бы сделали вызов setPRefferedSize для каждого компонента масштабирования с определенным подклассом java.awt.Dimension затем мы будем обходить иерархию компонентов и обновлять каждый компонент масштабирования всякий раз, когда изменяется разрешение.

Однако в Java 1.6 getPreferredSize возвращает копию переданного вами объекта Dimension, поэтому он больше не является правильным типом и ничего не масштабируется.

Я довольно быстро взломал решение, переопределив класс Component своей собственной реализацией (спасибо JRE с открытым исходным кодом), поместив его перед JRE на пути к классам. Однако это решение явно не поддается ремонту.

Кто-нибудь еще знает какое-либо другое решение этой проблемы, как бы вы реализовали масштабирование GUI в Java 1.5 / 1.6?

Это было полезно?

Решение

Похоже, что они защищают внутреннее состояние компонента в 1.6 лучше, чем раньше. Возможно, они запустили FindBugs и исправили bug .

Когда я впервые прочитал этот вопрос, я подумал о Java 1.6u10. Он включает в себя новый внешний вид Nimbus , который поддерживает высокий DPI отображается посредством использования векторной графики для отрисовки всех компонентов интерфейса.

Однако, прочитав вопрос немного медленнее и попытавшись понять, что вы говорите, я бы предложил переписать пользовательский интерфейс с помощью диспетчера макетов, который будет управлять размерами внутренних компонентов. Мне кажется, что ручное управление размерами компонентов, как вы предлагаете, на самом деле не очень хорошая идея. Как jjnguy , вы можете использовать GridBagLayout. Есть несколько других вариантов для менеджеров по макету. Был опубликован вопрос , в котором предлагается опрос всех любимых менеджеров по макету, если Вы ищете что-то отличное от GridBagLayout.

Другие советы

Смена менеджеров компоновки кажется хорошим решением, но в этом случае потребуется полная переработка пользовательского интерфейса (включающего в себя тысячи компонентов), так что это не очень практичное решение для этого приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top