MouseListener ml = new MouseListener(){
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {
((JMenu)e.getSource()).doClick();
}
};
jMenuFile.addMouseListener(ml);
jMenuHelp.addMouseListener(ml);
如果您在工具栏上有这么多菜单项,您可以迭代它:
for (Component c: jMenuBar1.getComponents()) {
if (c instanceof JMenu){
c.addMouseListener(ml);
}
}
roman c的首字母和接受的答案不会自动关闭菜单,子菜单项是jmenubar的一部分。 运行((jmenu)e.getsource()).doclick();在mouseenterned上,模拟单击某个jmenu父项,但不能简单地添加到mouseexited方法,因为mouselistener需要附加到子菜单项以及jmenu父项(它在菜单栏的常规赋值中不会这样做(仅附加到父jmenu对象)。 此外,当鼠标离开整个菜单结构(即子菜单下拉菜单)时,试图让mouseexit侦听器触发“close”方法,会出现一个问题。 下面是从我的live应用程序中得到的一个完全有效的答案: 我解决mouseout时关闭菜单的方法是在构造函数的顶部运行一个布尔变量“ismouseout”来保持跟踪,然后以一种更友好的oo方式分配mouselistener,以便在用户与菜单交互时跟踪多个mouseinmouseout事件。它调用一个单独的单核方法,作用于布尔值“ismouseout”的状态。类实现了mouselistener。就是这样做的。 创建一个数组列表,首先将所有菜单项添加到此数组。像这样:
Font menuFont = new Font("Arial", Font.PLAIN, 12);
JMenuBar menuBar = new JMenuBar();
getContentPane().add(menuBar, BorderLayout.NORTH);
// Array of MenuItems
ArrayList<JMenuItem> aMenuItms = new ArrayList<JMenuItem>();
JMenuItem mntmRefresh = new JMenuItem("Refresh");
JMenuItem mntmNew = new JMenuItem("New");
JMenuItem mntmNormal = new JMenuItem("Normal");
JMenuItem mntmMax = new JMenuItem("Max");
JMenuItem mntmStatus = new JMenuItem("Status");
JMenuItem mntmFeedback = new JMenuItem("Send Feedback");
JMenuItem mntmEtsyTWebsite = new JMenuItem("EtsyT website");
JMenuItem mntmAbout = new JMenuItem("About");
aMenuItms.add(mntmRefresh);
aMenuItms.add(mntmNew);
aMenuItms.add(mntmNormal);
aMenuItms.add(mntmMax);
aMenuItms.add(mntmStatus);
aMenuItms.add(mntmFeedback);
aMenuItms.add(mntmEtsyTWebsite);
aMenuItms.add(mntmAbout);
然后在此阶段使用for()循环在arraylist上迭代添加mouselistener:
for (Component c : aMenuItms) {
if (c instanceof JMenuItem) {
c.addMouseListener(ml);
}
}
现在为菜单栏设置jmenu父菜单:
// Now set JMenu parents on MenuBar
final JMenu mnFile = new JMenu("File");
menuBar.add(mnFile).setFont(menuFont);
final JMenu mnView = new JMenu("View");
menuBar.add(mnView).setFont(menuFont);
final JMenu mnHelp = new JMenu("Help");
menuBar.add(mnHelp).setFont(menuFont);
然后将下拉菜单Items children添加到jmenu parents:
// Now set menuItems as children of JMenu parents
mnFile.add(mntmRefresh).setFont(menuFont);
mnFile.add(mntmNew).setFont(menuFont);
mnView.add(mntmNormal).setFont(menuFont);
mnView.add(mntmMax).setFont(menuFont);
mnHelp.add(mntmStatus).setFont(menuFont);
mnHelp.add(mntmFeedback).setFont(menuFont);
mnHelp.add(mntmEtsyTWebsite).setFont(menuFont);
mnHelp.add(mntmAbout).setFont(menuFont);
将鼠标侦听器作为单独的步骤添加到jmenu父级:
for (Component c : menuBar.getComponents()) {
if (c instanceof JMenu) {
c.addMouseListener(ml);
}
}
2条答案
按热度按时间u7up0aaq1#
方法是添加
MouseListener
上JMenu
倾听事件mouseEntered
. 在事件处理程序中,只需使用doClick
. 例如,以编程方式单击鼠标后,它会自动打开弹出菜单。激活整个
JMenuBar
,则必须在每个JMenu
. 为此,最好单独创建一个侦听器对象。我在吧台上有两个菜单项,所以我做了:
如果您在工具栏上有这么多菜单项,您可以迭代它:
bfnvny8b2#
roman c的首字母和接受的答案不会自动关闭菜单,子菜单项是jmenubar的一部分。
运行((jmenu)e.getsource()).doclick();在mouseenterned上,模拟单击某个jmenu父项,但不能简单地添加到mouseexited方法,因为mouselistener需要附加到子菜单项以及jmenu父项(它在菜单栏的常规赋值中不会这样做(仅附加到父jmenu对象)。
此外,当鼠标离开整个菜单结构(即子菜单下拉菜单)时,试图让mouseexit侦听器触发“close”方法,会出现一个问题。
下面是从我的live应用程序中得到的一个完全有效的答案:
我解决mouseout时关闭菜单的方法是在构造函数的顶部运行一个布尔变量“ismouseout”来保持跟踪,然后以一种更友好的oo方式分配mouselistener,以便在用户与菜单交互时跟踪多个mouseinmouseout事件。它调用一个单独的单核方法,作用于布尔值“ismouseout”的状态。类实现了mouselistener。就是这样做的。
创建一个数组列表,首先将所有菜单项添加到此数组。像这样:
然后在此阶段使用for()循环在arraylist上迭代添加mouselistener:
现在为菜单栏设置jmenu父菜单:
然后将下拉菜单Items children添加到jmenu parents:
将鼠标侦听器作为单独的步骤添加到jmenu父级:
既然子menuitem元素都有自己的侦听器,这些侦听器独立于父jmenu元素和menubar本身,那么在mouselistener()示例化中标识对象类型很重要,这样可以在mouseover上自动打开菜单(在本例中为3x jmenu父级),但也可以避免子异常错误,允许在不监视鼠标位置的情况下,对菜单结构中的鼠标输出进行清晰的标识。鼠标器如下:
上面只模拟了鼠标点击jmenu“parents”(本例中为3x),因为它们是子菜单下拉菜单的触发器。timermenuclear()方法调用menuselectionmanager,以清空在实际鼠标移出时处于活动状态的selectedpath点:
我花了一点时间进行测试,监视在jvm开发过程中我可以访问哪些值—但它很管用!即使是嵌套菜单:)我希望很多人觉得这个完整的例子非常有用。