以下解释了您通过代码片段观察到的情况:
ComponentOrientation
仅适用于 Swing(实际上是 AWT)组件。
使用时JFrame.setDefaultLookAndFeelDecorated(true);
,然后整个框架装饰由 Swing 执行(实际上是 LookAndFeel 本身),因此这按预期工作。
如果您不设置此选项,则意味着操作系统负责框架装饰,但操作系统无法意识到ComponentOrientation
由您的 Swing 组件使用!
我期望操作系统(你有没有提到你到底使用什么操作系统?似乎是 Windows 7 对吧?)根据当前选择执行正确的装饰Locale。因此,如果您有阿拉伯语言区域设置并在操作系统上选择,我想所有窗口装饰都是从右到左的。您是否尝试更改该区域设置(通过“区域和语言”控制面板)?有效吗?
注意:我认为您不能直接从 Java 更改这些操作系统设置,但您可以使用以下命令读取它们Locale.getDefault()
.
总结:
首先,你必须确保您的操作系统配置正确在文本方向方面;抱歉,我在这里帮不了什么忙,因为我的 Windows 计算机上没有安装任何从右到左的语言。
然后,使用系统外观并确保JFrame.setDefaultLookAndFeelDecorated(false);
如果这不起作用,那么您可以考虑将您的代码片段以及您的系统配置发布到 Oracle Java bugs 列表
以下是有关如何改进这部分代码的额外说明(但这并不能解决您的问题)
顺便说一句,如果您让用户定义其操作系统语言首选项,那么您不应该显式硬编码frame.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
而是使用类似的东西:
frame.applyComponentOrientation(
ComponentOrientation.getOrientation(Locale.getDefault()));
Where Locale.getDefault()
,除非在应用程序中明确更改,否则将返回当前选择的操作系统级别Locale
.
另请注意,最好使用applyComponentOrientation()
而不是setComponentOrientation()
,因为前者递归地将给定方向设置为组件的整个层次结构。
最后,您必须确保在您的窗口中LayoutManager
使用的是从右到左感知的;这通常适用于所有标准 Swing 布局,但不适用于所有第 3 方布局管理器(如果您使用某些布局管理器)。