gpt4 book ai didi

java - JMenu 不会自动取消选择

转载 作者:行者123 更新时间:2023-12-01 04:32:50 26 4
gpt4 key购买 nike

我正在开发一个 java 项目,其中使用了一些 swing 组件。我的 JMenuBar 有问题。我有一个扩展 JMenuBar 的类。它是功能性的,它作为一对 JMenu 对象和每个对象中的一对 JMenuItems 。问题是,在某些情况下,选择 JMenu 后,它不会自动取消选择。例如,如果我选择一个 JMenu(当选择 JMenu 时,它的 JMenuItems 将像列表一样可见)并按键盘上的 alt+tab,则具有 JMenuBar 的 JFrame 对象将被隐藏,但 JMenu 仍保留在屏幕上。另一种情况是,当我选择 JMenu 并使用鼠标移动主 JFrame 时,框架会移动,但 JMenu 不会取消选择或移动,再次保持静止。我将放置一些图像和我的代码以更具解释性。

这是选择菜单后按 alt+tab 的场景 - 这是不需要的:

/image/ZAOXj.png )

这是在选择 JMenu 后立即用鼠标移动主 JFrame 的场景 -- 这也是不需要的:

/image/OX1KK.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);


}

我在谷歌上搜索了几个小时,但没有成功。如有任何帮助,我们将不胜感激。

最佳答案

您的代码实际上没有任何问题。这是 JMenuBar 实现中的一个错误。

关于java - JMenu 不会自动取消选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17767787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com