У меня есть JMenu
A в пределах JMenuBar
, выровненный вправо от экрана. В этом меню несколько JMenuItems
, а также другое JMenu
B. Поскольку меню A выровнено вправо, мне нужно меню B, чтобы открыть слева. Для этого я нашел кодРазвернуть JMenu влево, сохраняя при этом выравнивание текста по умолчанию
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);
}
};
Большие ура! Второй работал, обновит вопрос, чтобы показать рабочий код. – Hungry