要将我的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:
EDIT2:
我真的需要修复这个问题,所以我提供了500多个会给这样的JFrame(使用WindowsLookAndFeel):
答案 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
只是开玩笑,这一个??? ...
代码:
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),所以我无法保证,但它可能值得一试。