从右到左设置JFrame Orientation!

时间:2011-06-23 14:35:14

标签: java swing orientation jframe arabic

要将我的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

5 个答案:

答案 0 :(得分:7)

以下说明了您在代码段中观察到的内容:

ComponentOrientation仅适用于Swing(实际上是AWT)组件。

使用JFrame.setDefaultLookAndFeelDecorated(true);时,整个帧装饰由Swing(实际上是LookAndFeel本身)执行,因此这可以按预期工作。

如果你没有设置这个选项,那意味着操作系统负责框架装饰,但操作系统无法知道你的Swing组件使用的ComponentOrientation

我希望操作系统(您是否提到了您使用的操作系统?看起来似乎是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布局,这通常都可以,但如果你使用的话,不适用于所有第三方布局管理器。

答案 1 :(得分:5)

@ 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 :(得分:3)

我怀疑它必须在操作系统上做更多事情。通常(如果你不调用setDefaultLookAndFeelDecorated),它是提供帧装饰的操作系统,而不是LAF。

您应该尝试更改操作系统中的首选项,以表示您想要从右向左方向。

抱歉,我不知道这些设置会在哪里。 执行此操作后,您应该可以删除对setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 的调用,因为LAF将从区域设置中获取操作系统设置。

修改

This Link介绍了如何在Windows 7上启用从右到左文本。然后我想想您还需要change your locale.

答案 3 :(得分:1)

看起来Windows LookAndFeel不支持组件方向功能(至少不支持标题栏)

答案 4 :(得分:1)

这是one posibility。此实用程序专为已切换到Windows并希望左侧有窗口按钮的Mac用户设计,但它应该满足您的需求。

此解决方案与Java无关(因此我不知道它是否可以满足您的需求),听起来它应用于您的应用程序外部。我自己无法尝试(我没有运行Windows),所以我无法保证,但它可能值得一试。