java - 从右到左设置 JFrame 方向!

标签 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

编辑 2:

我真的非常需要解决这个问题,所以我提供 500+ 给谁会提供这样的 JFrame(使用 WindowsLookAndFeel):

enter image description here

最佳答案

以下解释了您通过代码片段观察到的内容:

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

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

如果您不设置此选项,则意味着操作系统负责框架装饰,但操作系统无法知道您的 Swing 组件使用的 ComponentOrientation!

我希望操作系统(您有没有提到您使用的是什么操作系统?似乎是 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() 将返回当前选择的操作系统级别 Locale

另请注意,最好使用 applyComponentOrientation() 而不是 setComponentOrientation(),因为前者递归地将给定方向设置为整个组件层次结构。

最后,您必须确保在您的窗口中使用的 LayoutManager 是从右到左感知的;这通常适用于所有标准 Swing 布局,但不适用于所有第 3 方布局管理器(如果您使用某些布局管理器)。

关于java - 从右到左设置 JFrame 方向!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6455831/

相关文章:

android - 移动景观中的网站,键盘布局问题

java - 试图保护 PDF (iText) 试图禁止用户复制 pdf 的内容

java - '@' 的转义字符——JDBC?

java - 如何修复 org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean with name 'name' ?

java - MustacheException : No method or field with name 'Id' on line 15. 白标错误页面

Java drawString 正在绘制超出范围的字符串

java - JTable 插入列而不是行

java - 我恢复了已删除的 .class 文件,但是当我尝试使用 java 运行它时,它给出了 classFormatException?

ionic-framework - 检测 Ionic App 中的方向变化

c# - 弹出窗口内的浏览器方向 - Windows Phone 7