Java 单击鼠标后JMenu将保持选中状态

Java 单击鼠标后JMenu将保持选中状态,java,swing,jmenu,Java,Swing,Jmenu,我有一个带有菜单栏的JApplet。问题是每当我点击菜单时,无论结果如何,它都会保持选中状态,除非我点击屏幕上的其他地方 下面是一个小示例代码来描述该场景: public class Frame extends JApplet{ public static String title = "Tower Defence Game"; JMenuBar menubar; JMenu menuCreateMap; @Override public void i

我有一个带有菜单栏的
JApplet
。问题是每当我点击菜单时,无论结果如何,它都会保持选中状态,除非我点击屏幕上的其他地方

下面是一个小示例代码来描述该场景:

public class Frame extends JApplet{

    public static String title = "Tower Defence Game";
    JMenuBar menubar;
    JMenu menuCreateMap;

    @Override
    public void init() {

        menubar = new JMenuBar();

        menuCreateMap = new JMenu("Create Map");

        menuCreateMap.addMenuListener(new MenuHandler(new Frame()));  

        menubar.add(menuCreateMap);

        setJMenuBar(menubar);

        this.setPreferredSize(new Dimension(getHeight(), getWidth())); 
        setVisible(true);           
    }
}
MenuHandler
class

public class MenuHandler extends Thread implements MenuListener {

    Frame frame;
    JMenu myMenu; 
    MenuHandler menuHandler;

    MenuHandler() {}

    MenuHandler(Frame frame) {
        this.frame = frame;     
        menuHandler = new MenuHandler();
    }

    @Override
    public void menuSelected(MenuEvent e) {

        myMenu = (JMenu) e.getSource();

        String selectedOption = myMenu.getText();

        if(selectedOption.equalsIgnoreCase("Create Map")) {

            menuHandler.start();
        }

    }

    public void run() {
        JLabel label = new JLabel("Hello World");
        label.setText("Hello");
        label.setBounds(100, 100, 100, 100);
        this.frame.add(label);
    }   
}
这段代码将抛出一个异常,但您会看到菜单将保持选中状态


如何解决此问题?

如果我们想通过JMenuBar中的JMenu组件触发事件,我们应该尝试更改它并将JBUtton添加到JMenuBar而不是JMenu。因为JMenu不应该以这种方式使用。尽管如此,如果您在该JMenu中有一个JMenuItem,那么您可以触发事件并适当地处理它。

不要使用MenuListener,将ActionListener附加到菜单项,而不应该在小程序中创建框架,这可能会导致SecurityManagerExceptionIt可能因为异常而保持选中状态。您看到的是预期结果,JMenu是JMenuItens的容器,它本身并不意味着是一个可操作项否,它保持选中状态是因为它的设计目的就是这样。这不是应该使用的方式,或者您应该使用
JToolBar
添加
JButton
s,因为这是预期的用户体验,没有人希望在菜单栏上找到菜单之外的任何内容……感谢您节省了我的时间。