Java GUI Разрешение Независимое Масштабирование - PullRequest
1 голос
/ 09 октября 2008

Я работаю над большим унаследованным 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?

Ответы [ 2 ]

2 голосов
/ 09 октября 2008

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

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

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

0 голосов
/ 09 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...