设置JFrame方向从右到左!

2022-09-03 14:39:18

为了从右到左对齐我的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


答案 1

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

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

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

如果您没有设置此选项,则意味着操作系统负责框架装饰,但是操作系统无法知道您的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()

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


答案 2

@Eng.福阿德

只是开玩笑,这个???...

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() {
    }
}

推荐