JMenu не отменяется автоматически

Я работаю над Java-проектом, в котором я использую некоторые компоненты Swing. У меня проблема с JMenuBar. У меня есть класс, расширяющий JMenuBar. Функционален, это как пара объектов JMenu и пара JMenuItems в каждом из них. Проблема в том, что в некоторых ситуациях после выбора JMenu он не отменяется автоматически. Например, если я выбираю JMenu (когда выбрано JMenu, его JMenuItems становится видимым как список) и нажимаю alt + tab на клавиатуре, объект JFrame с JMenuBar скрывается, но JMenu остается на экране. Другая ситуация заключается в том, что когда я выбираю JMenu и перемещаю основной JFrame с помощью мыши, фрейм перемещается, но 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);


}

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


person user2603201    schedule 20.07.2013    source источник
comment
Я надеюсь, что код, вызывающий `startGUIFrame ', действительно делает это на Тема диспетчера событий   -  person nIcE cOw    schedule 21.07.2013
comment
Я предполагаю, что вы говорите о вызове метода startGUIFrame с использованием SwingUtilities.invokeLater, нет, я этого не делал. Чтобы решить проблему, я обновил sdk с 1.6 до 1.7, проблема решена!   -  person user2603201    schedule 21.07.2013
comment
Да, правда, такие проблемы тоже могут возникнуть, если GUI не обновляется на EDT   -  person nIcE cOw    schedule 21.07.2013


Ответы (1)


На самом деле с вашим кодом все в порядке. Это ошибка в реализации JMenuBar.

person tbodt    schedule 21.07.2013
comment
Спасибо, я обновил свой java sdk с 1.6 до 1.7, и теперь проблема решена! - person user2603201; 21.07.2013