需要MenuBar的MouseOutEvent来检测点击:GWT

时间:2013-01-22 01:26:31

标签: java events gwt menubar

我是使用GWT的初学者。我有一个menubar,我想在屏幕上保留,即使鼠标没有在它上面。但是,当鼠标不在menubar上并点击屏幕上某处时,我希望菜单栏消失。我尝试使用MouseOutEvent,但我只需要点击鼠标时才需要它才能触发。任何帮助将不胜感激。

this.menu.addDomHandler(menuHoverOutHandler, MouseOutEvent.getType());

 MouseOutHandler menuHoverOutHandler = new MouseOutHandler() {
       public void onMouseOut(MouseOutEvent event) {
            Window.alert("I am outside the region");
        }
    };

2 个答案:

答案 0 :(得分:0)

以下是从我的实时应用中获得的完整解决方案:

我解决鼠标输出关闭菜单的方法是在构造函数的顶部运行一个布尔变量“isMouseOut”来跟踪,然后以更友好的方式分配MouseListener以跟踪多个MouseIn -MouseOut事件作为用户与菜单交互。它调用一个单独的menuClear方法作用于布尔值“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);

然后在此阶段迭代arrayList,使用for()循环添加MouseListener:

  for (Component c : aMenuItms) {
        if (c instanceof JMenuItem) {
            c.addMouseListener(ml);
        }
    }

现在为MenuBar设置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);

将mouseListeners作为单独的步骤添加到JMenu父项:

    for (Component c : menuBar.getComponents()) {
        if (c instanceof JMenu) {
            c.addMouseListener(ml);
        }
    }

现在,子menuItem元素都有自己的侦听器,它们与父JMenu元素和MenuBar本身分开 - 在MouseListener()实例化中识别对象类型非常重要,这样就可以自动打开菜单了。 mouseover(在本例中为3x JMenu父项)但也避免了子异常错误,并允许干净地识别菜单结构的mouseOUT,而不试图监视鼠标位置。 MouseListener如下:

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'父母'(本例中为3x),因为它们是子菜单下拉菜单的触发器。 timerMenuClear()方法调用MenuSelectionManager来清空实际mouseOUT时所选择的路径点:

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在开发过程中可以访问的值 - 但是它有效!即使有嵌套菜单:)我希望很多人觉得这个完整的例子非常有用。

答案 1 :(得分:-1)

使用widget的模糊处理程序。它会检测窗口小部件何时失去焦点。