2014-10-22 4 views
2

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

setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);.

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

Example

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

enter image description here

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

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

ответ

3

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

public ComponentOrientation getComponentOrientation() 

метод JMenu вернуть ваш alignmnet

или JMenu имеет метод можно переопределить

protected Point getPopupMenuOrigin() 
+0

Большие ура! Второй работал, обновит вопрос, чтобы показать рабочий код. – Hungry

 Смежные вопросы

  • Нет связанных вопросов^_^