为了从右到左对齐我的 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);
}
});
}
}
但我希望它在没有这种装饰的情况下也能工作。如何解决这个问题?
编辑:
@mre 我想要一个像这样的 JFrame:
编辑 2:
我真的非常需要解决这个问题,所以我提供 500+ 给谁会提供这样的 JFrame(使用 WindowsLookAndFeel):
最佳答案
以下解释了您通过代码片段观察到的内容:
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/