将 JMenu 向左展开,同时保留默认文本对齐方式

Posted

技术标签:

【中文标题】将 JMenu 向左展开,同时保留默认文本对齐方式【英文标题】:Expand JMenu to left, while retaining default text alignment 【发布时间】:2014-10-22 11:07:21 【问题描述】:

JMenuBar 中有一个JMenu A,与屏幕右侧对齐。此菜单中有几个JMenuItems,还有另一个JMenu B。由于菜单 A 右对齐,我需要菜单 B 向左打开。为了做到这一点,我找到了代码

setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

但问题在于,这与菜单 2 的文本对齐方式相混淆,我希望它与其他菜单项完全一样。

我也尝试过使用 SwngConstants.leftAlign 手动对齐菜单 2,但这太严重了:

如何使菜单向左展开,同时保留默认的文本对齐方式?提前致谢!我用来生成上述图像的代码如下所示:

import java.awt.*;
import javax.swing.*;

public class Test  
    public Test()
        JFrame frame = new JFrame();
        JMenuBar menuBar = new JMenuBar();
        JMenu menu1 = new JMenu("Menu 1");
        JMenu menu2 = new JMenu("Menu 2");
        JMenuItem menuitem1 = new JMenuItem("Menu Item 1");
        JMenuItem menuitem2 = new JMenuItem("Menu Item 2");
        JMenuItem menuitem3 = new JMenuItem("Menu Item 3");
        JMenuItem menuitem4 = new JMenuItem("Menu Item 4");

        menuBar.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        menu1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        menu2.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        menu2.setHorizontalAlignment(SwingConstants.LEFT);

        menuBar.add(menu1);
        menu1.add(menuitem1);
        menu1.add(menuitem2);
        menu1.add(menu2);
        menu2.add(menuitem3);
        menu2.add(menuitem4);

        frame.setJMenuBar(menuBar);
        frame.getContentPane().setBackground(Color.WHITE);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(270,170));
        frame.pack();
        frame.setVisible(true);
    

    public static void main(String[] args)
        try
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                UIManager.getLookAndFeelDefaults().put("Label.font", new Font("Arial", Font.PLAIN, 12));
                UIManager.getLookAndFeelDefaults().put("Button.font", new Font("Arial", Font.PLAIN, 12));
                UIManager.getLookAndFeelDefaults().put("ComboBox.font", new Font("Arial", Font.PLAIN, 12));
                UIManager.getLookAndFeelDefaults().put("JTextField.font", new Font("Arial", Font.PLAIN, 12));
            new Test();
         catch(Exception e)
            JOptionPane.showConfirmDialog(null, e.getMessage());
        
    

更新:如果我删除将菜单从右到左对齐的代码行并将框架移动到显示屏幕的边缘,那么菜单会按预期运行(即菜单不会展开关闭显示器)。也许有一种方法可以告诉菜单不要扩展 JFrame 而不是监视器?

更新:感谢@StanislavL 的想法。使用以下代码覆盖菜单 2 就可以了,它还消除了两个菜单之间难看的重叠。请注意,菜单 2 不再需要 ComponentOrientation.RIGHT_TO_LEFT

JMenu menu2 = new JMenu("Menu 2")
    protected Point getPopupMenuOrigin()
        return new Point(-this.getPopupMenu().getPreferredSize().width, 0);
    
;

【问题讨论】:

【参考方案1】:

你可以尝试覆盖

public ComponentOrientation getComponentOrientation()

JMenu 返回 alignmnet 的方法

或者 JMenu 有你可以覆盖的方法

protected Point getPopupMenuOrigin()

【讨论】:

干杯!第二个工作,将更新问题以显示工作代码。

以上是关于将 JMenu 向左展开,同时保留默认文本对齐方式的主要内容,如果未能解决你的问题,请参考以下文章

将文本向左对齐/在材质 ui 框中的 div 内开始

如何将 <caption> 表中的文本向左对齐?

Zurb/Foundation 框架:如何将 top-bar-section 向左对齐而不是向右对齐

在引导工具提示中对齐文本

如何对齐 SpriteBatch.DrawString 绘制的文本?

如何在 kivymd 按钮中对齐文本?