Почему Java Swing ведет себя по-разному в разных системах?

Какой-то свинг-код, который я пишу на своем компьютере, ведет себя по-разному на компьютере моего коллеги, на моем компьютере и в ноутбуке.

Интересно, что я могу сделать, чтобы мои приложения Swing вели себя одинаково на каждом компьютере?

Я хочу убедиться, что алгоритм, который я тестировал на моем компьютере, будет работать так же, как на клиентских компьютерах.

Например, проблема с фокусировкой JTextField отлично работает в моем ноутбуке с Windows XP, но не на компьютере моего коллеги с Windows XP, ни на моем рабочем компьютере с Ubuntu.

обсервованный конкретная проблема JTextField не является предметом этого вопроса.

3 ответа

Решение

Проблемы с приложениями Swing на разных платформах являются общими, и они вызваны тем простым фактом, что независимо от того, какой уровень абстракции Java предлагает, он должен в какой-то момент играть в мяч с нативными компонентами базовой операционной системы. Несмотря на то, что Swing использует только окна (фрейм) и рисует все сам - расхождения очень распространены.

Я разрабатываю многоплатформенное приложение Swing - и пользователи Windows сообщают о всевозможных проблемах, которых нет у пользователей Linux, и наоборот. К сожалению, для таких проблем не существует серебряной пули - всестороннее тестирование и неприятные исправления - единственная игра в городе.

И все идет исключительно глючно и грязно в области сменного внешнего вида и ощущений. Например - изменение размера JSplitPane с помощью металла или нимба происходит очень быстро (как и ожидалось), но если вы используете GTK+ plaf, все идет к черту. Это более серьезная проблема (производительность) - визуальные проблемы (отсутствие границ, компоненты, неправильно помещающиеся в контейнеры и т. Д.) Не имеют конца... Несмотря на все это, Swing продолжает оставаться одним из лучших вариантов для многоплатформенных настольных приложений.

Интересно, что я могу сделать, чтобы мои приложения Swing вели себя одинаково на каждом компьютере?

Я работаю над сложным приложением Java Swing, которое поставляется на OS X / Windows / Linux, так что, как ответил Божидар, проблемы слишком реальны.

Для некоторых компонентов, если у вас есть некоторые навыки проектирования / программирования пользовательского интерфейса, вы можете просто написать свой собственный компонент: я понимаю, что это, вероятно, не полезный ответ, но он работает.

Например, мы хотели выпадающий список "найти как вы" (например, тот, который появляется при запуске поиска на главной странице поиска Google), который будет выглядеть и работать одинаково в Linux/Windows/OS X. После того, как мы попробовали бесчисленное количество "решений", полных специфических особенностей Swing, которые не сработали бы повсеместно (например, угадайте, что, фокусируйте вопросы;), мы решили просто написать наш собственный компонент "с нуля".

Мы можем перехватывать события мыши и клавиатуры в OS X / Windows / Linux: мы можем написать компонент, который не только выглядит, но и ведет себя одинаково на всех трех платформах.

В дополнение к "find-as-you-type", мы также написали наш собственный всплывающий компонент tooltip, двойную полосу прогресса (для индикатора прогресса в одном, чтобы показать прогресс в стиле производителя / потребителя на одной панели) и сложный компонент. использование нескольких "текстовых полей", которые были абсурдно сложными и ломались, когда мы пытались сделать это с помощью Swing (и разбивались по-разному на разных платформах, например, странные проблемы с фокусировкой или неявка каретки и т.д.). Таким образом, мы "испортились" и сами переписали весь компонент.

Результат? Работая одинаково на всех платформах, где Java может давать вам уведомления о событиях мыши и клавиатуры...

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

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

Я хочу убедиться, что алгоритм, который я тестировал на моем компьютере, будет работать так же, как на клиентских компьютерах

"Алгоритм" должен работать нормально.

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

а) в Windows вы получаете keyPressed, keyPressed, keyPressed, .... keyReleased.

б) в Unix вы получаете нажатие клавиш, keyReleased, keyPressed, keyReleased ...

Кстати, комментарий был бы хорош относительно того, работает ли мое предложение в вашей публикации "текстовое поле" или нет. Как я уже говорил, у меня нет платформы Ubuntu для тестирования, поэтому мне любопытно узнать результат.

Другие вопросы по тегам