Использование Java для разработки кроссплатформенных, шрифты по-разному масштабируются на разных платформах

Я делаю программное обеспечение для своего университета. Требуется графический интерфейс. В первой его редакции я использовал System Look and Feel (чтобы он выглядел как собственное приложение в Linux / Mac / Windows). Я обнаружил, что это обременительно, так как мне пришлось сделать все мои JLabels разного размера в зависимости от ОС (независимо от разрешения / плотности пикселей и т. Д.).

После этого я подумал: «Хорошо, я НЕ собираюсь повторять это снова», поэтому я решил не использовать внешний вид системы и попробовать Nimbus. Это выглядит хорошо на платформах, которые я тестировал, но размеры шрифта JLabel / JTextField по-прежнему отображаются неправильно на нескольких платформах, независимо от того, указаны ли они (как Sans Serif 12). Есть ли способ сделать шрифт действительно универсальным для всех платформ и избежать необходимости проводить все это кроссплатформенное тестирование?


person snotyak    schedule 16.08.2012    source источник
comment
В качестве примечания: если вы ориентируетесь в основном на Windows, я бы рекомендовал вам придерживаться System L & F. Все профессиональные приложения Swing пытаются выглядеть так, как приложения Windows, а остальная часть L&F выглядит странно для большинства пользователей Windows.   -  person Cratylus    schedule 16.08.2012
comment
Фактические настройки внешнего вида не так важны. Я просто хочу, чтобы его можно было легко использовать без необходимости вносить слишком много изменений для разных платформ. Это программное обеспечение предназначено только для ~ 20 человек, поэтому у меня нет конкретной цели. Однако приведенный выше вопрос носит довольно общий характер и поможет мне в будущей кроссплатформенной разработке.   -  person snotyak    schedule 17.08.2012


Ответы (3)


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

изображение

person trashgod    schedule 17.08.2012

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

Вы никогда не получите одинаковый результат от одной платформы к другой. Это сводится к разнице в настройках DPI отдельных платформ.

По этой же причине веб-страницы выглядят по-разному от платформы к платформе и почему многие приложения выглядят немного по-разному.

Лучшее, что вы можете сделать, - это тщательно спланировать свои пользовательские интерфейсы и грамотно использовать внутренние метрики Swings, а не устанавливать размеры напрямую.

person MadProgrammer    schedule 16.08.2012
comment
Это прискорбно, но это реально. Просить универсальное решение для запуска одного приложения в совершенно разных решениях довольно наивно, но, учитывая кроссплатформенность рекламных объявлений Java, это кажется более правдоподобным. Думаю, лучше всего было бы разработать уникальные версии для OSX, Linux и Windows или просто добавить несколько простых управляющих инструкций для настройки размеров шрифтов в зависимости от используемой текущей платформы. Я настроен оптимистично, поэтому надеюсь на другие ответы, хотя почти уверен, что вы правы. Спасибо - person snotyak; 17.08.2012
comment
Я бы выбрал второй вариант (установка базовых шрифтов на платформе n), вы можете использовать UIManger для этого, однако даже на одной и той же платформе вы столкнетесь с различиями, что отлично выглядит на моем 30-м экране дома, где что-то запущено вроде 120dpi, на работе на моем экране 22/92 dpi выглядит дерьмом;) - person MadProgrammer; 17.08.2012

Главное, что вы можете сделать, - это использовать конкретный шрифт TrueType и связать его как ресурс в своем приложении. Таким образом, у вас будет больше шансов, что шрифт будет одинаковым на всех платформах. Нет никакой гарантии, что «без засечек» будет одинаковым на всех платформах - Java просто будет использовать ближайшее доступное совпадение.

Затем вы можете загрузить шрифт из вашего .jar во время выполнения примерно так:

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename)
Font font = Font.createFont(Font.TRUETYPE_FONT, is);

В качестве второстепенного момента всегда стоит разрабатывать макет приложения так, чтобы был разумный уровень гибкости в отношении размера шрифта. Возможно, вам просто нужно освободить немного больше места для ваших JLabels, или сделать перенос текста в определенных местах и ​​т. Д.

person mikera    schedule 17.08.2012