установите JFrame Orientation справа налево! - PullRequest
15 голосов
/ 23 июня 2011

Чтобы выровнять мой JFrame справа налево, я использую:

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

но я хочу, чтобы это работало без этого украшения.Как решить эту проблему?

РЕДАКТИРОВАТЬ:

@ mre Я хочу JFrame, как этот:

enter image description here

EDIT2:

Мне действительно нужно, чтобы эта проблема была исправлена, поэтому я предлагаю 500+ тому, кто даст JFrame, подобный этому (с WindowsLookAndFeel):

enter image description here

Ответы [ 6 ]

7 голосов
/ 27 июня 2011

Ниже объясняется, что вы наблюдаете через фрагмент кода:

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, но не для всех сторонних менеджеров макетов, если вы их используете.

5 голосов
/ 14 июля 2011

@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() {
    }
}
3 голосов
/ 23 июня 2011

Я подозреваю, что это связано с ОС. Обычно (если вы не вызываете setDefaultLookAndFeelDecorated), именно ОС обеспечивает оформление кадра, а не LAF.

Вы должны попытаться изменить свои настройки в ОС, чтобы сказать, что вы хотите ориентироваться справа налево.

Извините, я не знаю, где будут эти настройки. Как только вы это сделаете, вы сможете удалить вызов на setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); , так как LAF выберет настройки ОС из локали.

EDIT

Эта ссылка описывает, как включить текст справа налево в Windows 7. Тогда я думаю, вам также потребуется изменить язык.

1 голос
/ 27 июня 2011

Вот одна возможность .Эта утилита предназначена для пользователей Mac, которые переключились на Windows и хотят, чтобы оконные кнопки находились слева, но должны отвечать тем же требованиям, что и у вас.

Это решение не имеет ничего общего с Java (поэтому я нене знаю, приемлемо ли это для ваших нужд) и звучит так, как будто это будет внешним по отношению к вашему приложению.Я сам не смог опробовать его (у меня нет Windows), поэтому я не могу поручиться за него, но, возможно, стоит попробовать.

1 голос
/ 23 июня 2011

Похоже, что компонент Ориентация компонентов не поддерживается Windows LookAndFeel (по крайней мере, не для строки заголовка)

0 голосов
/ 11 мая 2018

Вам нужно только добавить эту строку кода, и я уверен, что она работает на 100%.

frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

enter image description here

...