Разверните JMenu влево, сохранив при этом выравнивание текста по умолчанию.

У меня есть JMenu A внутри JMenuBar, выровненного по правому краю экрана. В этом меню есть несколько JMenuItems, а также еще один JMenu B. Поскольку меню A выровнено по правому краю, мне нужно, чтобы меню B открывалось слева. Для этого я нашел код

setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);.

Однако проблема заключается в том, что это мешает выравниванию текста в меню 2, которое я хотел бы оставить точно таким же, как и другие пункты меню.

Пример

Я также пытался вручную выровнять меню 2 с помощью SwngConstants.leftAlign, однако это слишком серьезно:

введите здесь описание изображения

Как я могу расширить меню влево, сохранив при этом выравнивание текста по умолчанию? Заранее спасибо! Код, который я использовал для создания приведенных выше изображений, показан ниже:

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);
    }
};

person Hungry    schedule 22.10.2014    source источник


Ответы (1)


Вы можете попробовать переопределить

public ComponentOrientation getComponentOrientation()

метод JMenu, чтобы вернуть ваш alignmnet

или JMenu имеет метод, который вы можете переопределить

protected Point getPopupMenuOrigin()
person StanislavL    schedule 22.10.2014
comment
Отличного настроения! Второй сработал, обновит вопрос, чтобы показать рабочий код. - person Hungry; 22.10.2014