Ниже объясняется, что вы наблюдаете через фрагмент кода:
ComponentOrientation
применимо только к компонентам Swing (и фактически AWT).
При использовании JFrame.setDefaultLookAndFeelDecorated(true);
тогда все оформление фрейма выполняется Swing (фактически, самим LookAndFeel), так что это работает, как и ожидалось.
Если вы не установите эту опцию, это означает, что ОС отвечает за оформление фрейма, однако ОС не может знать о ComponentOrientation
, используемом вашими компонентами Swing!
Я ожидаю, что ОС (вы упомянули, какую именно ОС вы используете? Это похоже на Windows 7, верно?) Выполнит правильное оформление на основе выбранной в настоящее время Локали . Следовательно, если у вас установлена арабская локаль и вы выбрали ее в своей ОС, я думаю, что все окна оформлены справа налево. Вы пытались изменить эту локаль (через панель управления «Регион и язык»)? Это сработало?
Примечание: я не думаю, что вы можете изменить эти настройки ОС непосредственно из Java, но вы можете прочитать их с помощью Locale.getDefault()
.
Подводя итог:
Прежде всего, вы должны убедиться, что ваша ОС правильно настроена с точки зрения ориентации текста; извините, я не могу помочь здесь, потому что на моем компьютере с Windows не установлено никаких языков с написанием справа налево.
затем используйте внешний вид системы и убедитесь, что JFrame.setDefaultLookAndFeelDecorated(false);
если это не сработает, то вы можете рассмотреть возможность размещения своего фрагмента кода вместе с конфигурацией вашей системы в списке ошибок Oracle Java
Ниже приводятся дополнительные заметки о том, как улучшить эту часть вашего кода (но это не является решением вашей проблемы)
Кстати, если вы позволяете пользователю определять свои языковые предпочтения ОС, то вам не следует явно жестко кодировать frame.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
, а использовать что-то вроде:
frame.applyComponentOrientation(
ComponentOrientation.getOrientation(Locale.getDefault()));
Где Locale.getDefault()
, если явно не изменено в вашем приложении, вернет текущий уровень ОС, выбранный в данный момент Locale
.
Также обратите внимание, что предпочтительнее использовать applyComponentOrientation()
, а не setComponentOrientation()
, потому что первый рекурсивно устанавливает данную ориентацию для всей иерархии компонентов.
Наконец, вы должны будете убедиться, что в ваших окнах LayoutManager
используется справа налево; Обычно это нормально для всех стандартных макетов Swing, но не для всех сторонних менеджеров макетов, если вы их используете.