2013-07-20 2 views
1

Я работаю над проектом java, где я использую некоторые компоненты поворота. У меня проблема с JMenuBar. У меня есть класс, который расширяет JMenuBar. Он функциональный, он как пара объектов JMenu и пара JMenuItems в каждом из них. Проблема в том, что в некоторых ситуациях после выбора JMenu он не отменяется автоматически. Например, если я выбираю JMenu (когда выбран JMenu, его JMenuItems становится видимым, как список) и нажмите клавишу alt + на клавиатуре, объект JFrame, который имеет JMenuBar, скрыт, но JMenu стоит на экране. Другая ситуация заключается в том, что, когда я выбираю JMenu и перемещаю основной JFrame с помощью мыши, кадр перемещается, но JMenu не отменяется и не перемещается, снова стоит на месте. Я поместил некоторые изображения и мой код, чтобы быть более объяснительными.JMenu не снимается автоматически

Это сценарий, нажав Alt + Tab после выбора меню - это нежелательная:

http://i.imgur.com/0qL2pdD.png)

Это сценарий перемещения основного JFrame с помощью мыши сразу после выбора JMenu - - Это также нежелательная:

http://i.imgur.com/c0BL4dE.png

А вот мой исходный код для моего пользовательского класса JMenuBar:

public class EOPLMenuBar extends JMenuBar{ 

private EOPLMenuBarListenerDelegate delegate; 


public EOPLMenuBar(EOPLMenuBarListenerDelegate delegate){ 
    this.delegate = delegate; 
    initEOPLMenuBar(); 

} 
private void initEOPLMenuBar(){ 

    // --- JMenu Initializations -------- // 
    JMenu eoplMenu = new JMenu("EOPL"); 
    Font f = new Font(eoplMenu.getFont().getFontName(), Font.BOLD, eoplMenu.getFont().getSize()); 
    eoplMenu.setFont(f); 


    eoplMenu.addMenuListener(new MenuListener() { 
     @Override 
     public void menuSelected(MenuEvent menuEvent) { 
      System.out.println("Menu selected"); 
      //To change body of implemented methods use File | Settings | File Templates. 
     } 

     @Override 
     public void menuDeselected(MenuEvent menuEvent) { 
      System.out.println("Menu deselected"); 
     } 

     @Override 
     public void menuCanceled(MenuEvent menuEvent) { 
      System.out.println("Menu canceled"); 
     } 
    }); 

    JMenu fileMenu = new JMenu("File"); 
    JMenu examplesMenu = new JMenu("Examples"); 

    this.add(eoplMenu); 
    this.add(fileMenu); 
    this.add(examplesMenu); 

    ///------EOPLMenu items---------- /// 
    JMenuItem item1 = new JMenuItem(MenuItemType.ABOUT_EOPL_GUI.getName()); 
    JMenuItem item2 = new JMenuItem(MenuItemType.SETTINGS.getName()); 
    JMenuItem item3 = new JMenuItem(MenuItemType.QUIT_EOPL_GUI.getName()); 

    eoplMenu.add(item1); 
    eoplMenu.addSeparator(); 
    eoplMenu.add(item2); 
    eoplMenu.addSeparator(); 
    eoplMenu.add(item3); 


    ///------FileMenu items-----------/// 
    JMenuItem item4 = new JMenuItem(MenuItemType.SAVE_FILE.getName()); 
    fileMenu.add(item4); 

    ///------ExampleMenu items -------/// 
    JMenu letMenu = new JMenu("Proc"); 
    JMenuItem item5 = new JMenuItem(MenuItemType.PROC_EXAMPLE_1.getName()); 
    JMenuItem item6 = new JMenuItem(MenuItemType.PROC_EXAMPLE_2.getName()); 
    letMenu.add(item5); 
    letMenu.add(item6); 
    JMenuItem item7 = new JMenuItem(MenuItemType.LET_EXAMPLE_1.getName()); 
    JMenuItem item8 = new JMenuItem(MenuItemType.LET_EXAMPLE_2.getName()); 
    JMenuItem item9 = new JMenuItem(MenuItemType.LETREC_EXAMPLE_1.getName()); 
    JMenuItem item10 = new JMenuItem(MenuItemType.LETREC_EXAMPLE_2.getName()); 
    JMenuItem item11 = new JMenuItem(MenuItemType.CALL_BY_NEED_EXAMPLE_1.getName()); 
    JMenuItem item12 = new JMenuItem(MenuItemType.CALL_BY_NEED_EXAMPLE_2.getName()); 
    JMenuItem item13 = new JMenuItem(MenuItemType.CALL_BY_REF_EXAMPLE_1.getName()); 
    JMenuItem item14 = new JMenuItem(MenuItemType.CALL_BY_REF_EXAMPLE_2.getName()); 

    examplesMenu.add(letMenu); 
    examplesMenu.add(item7); 
    examplesMenu.add(item8); 
    examplesMenu.add(item9); 
    examplesMenu.add(item10); 
    examplesMenu.add(item11); 
    examplesMenu.add(item12); 
    examplesMenu.add(item13); 
    examplesMenu.add(item14); 

    // -- Add ActionListeners to all items. 
    item1.addActionListener(new EOPLMenuBarListener(item1.getText())); 
    item2.addActionListener(new EOPLMenuBarListener(item2.getText())); 
    item3.addActionListener(new EOPLMenuBarListener(item3.getText())); 
    item4.addActionListener(new EOPLMenuBarListener(item4.getText())); 
    item5.addActionListener(new EOPLMenuBarListener(item5.getText())); 
    item6.addActionListener(new EOPLMenuBarListener(item6.getText())); 

} 



private class EOPLMenuBarListener implements ActionListener{ 

    private String itemType; 


    public EOPLMenuBarListener(String type){ 
     this.itemType = type; 
    } 

    @Override 
    public void actionPerformed(ActionEvent actionEvent) { 
     //To change body of implemented methods use File | Settings | File Templates. 

     if(itemType.equals(EOPLMenuBar.MenuItemType.LET_EXAMPLE_1.getName())){ 

     delegate.prepareUIWithExampleSourcecode("let x = -(4,1) in -(x,1)","let"); 

     }else if(itemType.equals(EOPLMenuBar.MenuItemType.LET_EXAMPLE_2.getName())){ 

     delegate.prepareUIWithExampleSourcecode("let x = 3 in let x = -(x,1) in x","let"); 

     } 
    } 


} 

public enum MenuItemType{ 

    ABOUT_EOPL_GUI (String.format("%-15s","About EOPL-GUI")), 
    SETTINGS   (String.format("%-15s","Settings")), 
    QUIT_EOPL_GUI  (String.format("%-15s","Quit EOPL-GUI")), 
    SAVE_FILE   (String.format("%-15s","Save File")), 
    LET_EXAMPLE_1  (String.format("%-15s","Let example-1")), 
    LET_EXAMPLE_2  (String.format("%-15s","Let example-2")), 
    PROC_EXAMPLE_1  (String.format("%-15s","Example 1")), 
    PROC_EXAMPLE_2  (String.format("%-15s","Example 2")), 
    LETREC_EXAMPLE_1  (String.format("%-15s","Letrec example-1")), 
    LETREC_EXAMPLE_2  (String.format("%-15s","Letrec example-2")), 
    CALL_BY_NEED_EXAMPLE_1  (String.format("%-15s","Call-by-need example-1")), 
    CALL_BY_NEED_EXAMPLE_2  (String.format("%-15s","Call-by-need example-2")), 
    CALL_BY_REF_EXAMPLE_1  (String.format("%-15s","Call-by-ref example-1")), 
    CALL_BY_REF_EXAMPLE_2  (String.format("%-15s","Call-by-ref example-2")); 


    private String name; 

    MenuItemType(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 
    } 
} 

А вот мой исходный код, где я использую свой собственный JMenuBar:

private static void startGUIFrame(){ 
    JFrame frame = new JFrame("EOPL GUI"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setResizable(true); 
    frame.setSize(900, 700); 
    frame.setLocationRelativeTo(null); 

    //Add content to the window. 
    frame.add(eoplPanel); 

    frame.setJMenuBar(new EOPLMenuBar(controller)); 

    //Display the window. 
    frame.pack(); 
    frame.setVisible(true); 


} 

Я искал в течение нескольких часов на гугле, но не повезло. Любая помощь приветствуется.

+0

Надеюсь, код, вызывающий 'startGUIFrame ', на самом деле делает это в [Event Dispatcher Thread] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) –

+0

I я предполагаю, что вы говорите о вызове метода startGUIFrame с помощью SwingUtilities.invokeLater, нет, я этого не делал. Чтобы решить проблему, я обновил sdk с 1.6 до 1.7, проблема решена! – user2603201

+0

Да, действительно, такие проблемы также могут возникнуть, если GUI не обновляется по EDT –

ответ

0

В коде нет ничего плохого. Это ошибка в реализации JMenuBar.

+0

Спасибо, я обновил свой java sdk с 1,6 до 1,7, и проблема теперь решена! – user2603201