У меня есть 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);
}
};