Java 悬停时激活JMenuBar
JMenuBar在第一次单击之前不会开始显示选定的或弹出窗口。单击中的某个位置后,所有这些项目都会响应鼠标悬停Java 悬停时激活JMenuBar,java,swing,jmenubar,mouse-listeners,Java,Swing,Jmenubar,Mouse Listeners,JMenuBar在第一次单击之前不会开始显示选定的或弹出窗口。单击中的某个位置后,所有这些项目都会响应鼠标悬停 我想绕过最初的点击要求,并有它在鼠标悬停时自动激活。有什么方法可以做到这一点吗?方法是在JMenu上添加一个MouseListener,并监听事件mouseenterned。在事件处理程序中,只需使用doClick单击它。比如说, jMenuFile.addMouseListener(new MouseListener(){ public void mouseEntered(M
我想绕过最初的点击要求,并有它在鼠标悬停时自动激活。有什么方法可以做到这一点吗?方法是在
JMenu
上添加一个MouseListener
,并监听事件mouseenterned
。在事件处理程序中,只需使用doClick
单击它。比如说,
jMenuFile.addMouseListener(new MouseListener(){
public void mouseEntered(MouseEvent e) {
jMenuFile.doClick();
}
...
});
以编程方式单击鼠标后,它会自动打开弹出菜单。要激活整个JMenuBar
,必须在每个JMenu
上添加一个侦听器。为此,最好单独创建侦听器对象
我在吧台上有两个菜单项,所以我做了:
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应用程序中得到的一个完全有效的答案: 我解决“鼠标出时关闭菜单”的方法是在构造函数顶部运行一个布尔变量“isMouseOut”以保持跟踪,然后以一种更加面向对象的方式分配MouseListener,以便在用户与菜单交互时跟踪多个MouseIn MouseOut事件。它调用一个单独的单核方法,作用于布尔值“isMouseOut”的状态。该类实现MouseListener。就是这样做的 创建一个ArrayList,首先将所有菜单项添加到此数组。像这样:
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);
现在为菜单栏设置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);
然后将下拉菜单子菜单添加到JMenu父菜单:
// 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);
}
}
既然子菜单项元素都有自己的监听器,这些监听器与父JMenu元素和菜单栏本身是分开的,那么在mouseStener()实例化中标识对象类型是很重要的,这样您就可以在mouseover上自动打开菜单(在本例中为3x JMenu父菜单)但也避免了子异常错误,并允许在不监视鼠标位置的情况下清晰地识别菜单结构的鼠标出。鼠标听筒如下所示:
MouseListener ml = new MouseListener() {
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
isMouseOut = true;
timerMenuClear();
}
public void mouseEntered(MouseEvent e) {
isMouseOut = false;
Object eSource = e.getSource();
if(eSource == mnHelp || eSource == mnView || eSource == mnFile){
((JMenu) eSource).doClick();
}
}
};
以上仅模拟鼠标点击JMenu“parents”(本例中为3x),因为它们是子菜单下拉菜单的触发器。timerMenuClear()方法调用MenuSelectManager,以清空在实际鼠标移出时处于活动状态的任何selectedpath点:
public void timerMenuClear(){
ActionListener task = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(isMouseOut == true){
System.out.println("Timer");
MenuSelectionManager.defaultManager().clearSelectedPath();
}
}
};
//Delay timer half a second to ensure real mouseOUT
Timer timer = new Timer(1000, task);
timer.setInitialDelay(500);
timer.setRepeats(false);
timer.start();
}
我花了一点时间进行测试,监控在JVM开发过程中我可以访问哪些值——但它非常有效!即使使用嵌套菜单:)我希望很多人都觉得这个完整的示例非常有用。有什么好的理由要这样做吗?所有应用程序中的所有菜单栏都是这样的。我的菜单有一个自定义的外观,这种行为更加自然。另外,我相信这种行为对用户来说更具交互性。我理解mouseenterned侦听器,但如何从mousentered激活整个JMenuBar?谢谢。这使我的方法走上了正确的轨道,但我想我希望有一种更简单的方法来实现这一点,比如jMenuBar.activate(),而不是单独强制单击。对于JMenuItem,您不能调用doCLIKE(),相反,我相信生成此行为的最佳方法是SETARBART(TRUE),也可以考虑<代码> MouseAdapter <代码>,而不是“MySististER”。
public void timerMenuClear(){
ActionListener task = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(isMouseOut == true){
System.out.println("Timer");
MenuSelectionManager.defaultManager().clearSelectedPath();
}
}
};
//Delay timer half a second to ensure real mouseOUT
Timer timer = new Timer(1000, task);
timer.setInitialDelay(500);
timer.setRepeats(false);
timer.start();
}