Установите ориентацию JFrame справа налево!
Чтобы выровнять JFrame с righ-to-left, я использую:
setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
но это работает, только если я использую следующий стиль (украшение) JFrame:
public class RightToLeft {
public static void main(String []args){
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run() {
try { UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); }
catch (Exception e) { e.printStackTrace(); }
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("العنوان بالعربي");
frame.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
frame.setSize(300,300);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
![enter image description here]()
но я хочу, чтобы он работал без этого украшения. Как решить эту проблему?
EDIT:
@mre Мне нужен JFrame, как этот:
![enter image description here]()
EDIT2:
Мне действительно нужна эта проблема для исправления, поэтому я предлагаю 500+ тем, кто предоставит JFrame, как это (с WindowsLookAndFeel):
![enter image description here]()
Ответы
Ответ 1
@Eng.Fouad
просто шутка и эта...????
![Substance L&F]()
код:
import java.awt.ComponentOrientation;
import javax.swing.JFrame;
import javax.swing.UIManager;
import org.pushingpixels.substance.api.skin.SubstanceOfficeSilver2007LookAndFeel;
public class RightToLeft {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
//UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
UIManager.setLookAndFeel(new SubstanceOfficeSilver2007LookAndFeel());
} catch (Exception e) {
e.printStackTrace();
}
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("العنوان بالعربي");
frame.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
});
}
private RightToLeft() {
}
}
Ответ 2
Ниже объясняется, что вы наблюдаете в своем фрагменте кода:
ComponentOrientation
применим только к компонентам Swing (и AWT).
При использовании JFrame.setDefaultLookAndFeelDecorated(true);
, тогда оформление всего кадра выполняется Swing (фактически сам LookAndFeel), поэтому это работает так, как ожидалось.
Если вы не установите этот параметр, это означает, что ОС отвечает за декодирование кадра, однако ОС не может знать о ComponentOrientation
, используемом вашими компонентами Swing!
Я ожидаю ОС (вы упоминали, какую ОС вы используете точно? Кажется, что Windows 7 правильно?), чтобы выполнить правильное оформление на основе выбранного Locale. Следовательно, если у вас есть установка на арабском языке и выбрана на вашей ОС, я думаю, что все окна украшены справа налево. Вы пытались изменить этот язык (через панель управления "Регион и язык" )? Это сработало?
Примечание. Я не думаю, что вы можете изменить эти настройки ОС непосредственно с Java, но вы можете прочитать их с помощью Locale.getDefault()
.
Подводя итог:
-
прежде всего, вы должны убедиться, что ваша ОС правильно настроена с точки зрения ориентации текста; жаль, что я ничего не могу поделать, потому что у меня нет языковых языков справа налево, установленных на моей машине Windows.
-
затем используйте внешний вид системы и убедитесь, что JFrame.setDefaultLookAndFeelDecorated(false);
-
Если это не сработает, вы можете рассмотреть отправку фрагмента кода вместе со своей конфигурацией системы в список ошибок Oracle Java
Далее следует дополнительная заметка о том, как улучшить эту часть вашего кода (но это не проблема для вашей проблемы)
Кстати, если вы позволите пользователю определить его настройки языка ОС, то вы не должны явно жестко программировать frame.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
, а скорее использовать что-то вроде:
frame.applyComponentOrientation(
ComponentOrientation.getOrientation(Locale.getDefault()));
Если Locale.getDefault()
, если явно не изменено в вашем приложении, вернет выбранный OS-уровень Locale
.
Также обратите внимание, что предпочтительнее использовать applyComponentOrientation()
, а не setComponentOrientation()
, потому что первая рекурсивно задает заданную ориентацию всей иерархии компонентов.
Наконец, в ваших окнах вам нужно будет убедиться, что LayoutManager
используется справа налево; обычно это нормально со всеми стандартными макетами Swing, но не для всех сторонних менеджеров макетов, если вы используете некоторые.
Ответ 3
Я подозреваю, что он должен делать больше с ОС. Обычно (если вы не вызываете setDefaultLookAndFeelDecorated
), то OS обеспечивает декодирование кадра, а не LAF.
Вам следует попробовать изменить свои настройки в ОС, чтобы сказать, что вы хотите иметь право налево.
Извините, я не знаю, где бы эти настройки были.
Как только вы это сделаете, вы сможете удалить вызов setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
, поскольку LAF подберет настройки ОС из локали.
ИЗМЕНИТЬ
Эта ссылка описывает, как включить текст справа налево в Windows 7. Тогда я думаю, вам также понадобится изменить свой язык.
Ответ 4
Похоже, что функция "Ориентация компонентов" не поддерживается в Windows LookAndFeel (по крайней мере, не для строки заголовка).
Ответ 5
Вот одна возможность. Эта утилита предназначена для пользователей Mac, которые переключились на Windows и хотят, чтобы кнопки окна слева, но они должны отвечать тем же потребностям, что и ваши.
Это решение не имеет ничего общего с Java (поэтому я не знаю, даже ли оно приемлемо для ваших нужд) и звучит так, как будто оно будет внешним по отношению к вашему приложению. Я не смог проверить это самостоятельно (я не запускаю Windows), поэтому я не могу ручаться за него, но, возможно, стоит попробовать.