【问题标题】:How can I stop an SWT composite control from firing a MouseExit event when the mouse enters a component control?当鼠标进入组件控件时,如何阻止 SWT 复合控件触发 MouseExit 事件?
【发布时间】:2011-01-24 21:45:40
【问题描述】:

我对 org.eclipse.swt.widgets.Composite 进行了子类化以创建新的复合控件。我想在此控件中捕获 MouseEnter 和 MouseExit 事件,但我遇到的问题是,当鼠标悬停在控件中的组件(例如标签)上时,即使标签是整体的一部分,也会触发 MouseExit 事件复合。

有没有办法阻止这个事件被触发?如果鼠标离开控件的总边界,我只想查看事件。这是一些示例代码,可以向您展示我的意思。

public class MyControl extends Composite{

Label label;

public MyControl(Composite parent, String label) {
    super(parent, SWT.NONE);
    label = new Label(this,0);
    label.setText(label);

    this.addListener(SWT.MouseEnter, new Listener() {
        @Override
        public void handleEvent(Event event) {
            // handle this event
        }           
    });
    this.addListener(SWT.MouseExit, new Listener() {
        @Override
        public void handleEvent(Event event) {
            // handle this event
        }           
    });
}

}

【问题讨论】:

    标签: java events eclipse-plugin swt


    【解决方案1】:

    您可以简单地在您的事件处理程序中放置一个逻辑来查看控件是否是您的新控件的子控件并忽略它。类似于以下内容:(我没有测试过代码,但我认为这应该适合你)

        this.addListener(SWT.MouseExit, new Listener() {
            @Override
            public void handleEvent(Event event) {
                for (Control control : ParentClass.this.getChildren()) {
                    if (control == event.item)
                        return;
                }
                // handler logic goes here
            }           
        });
    

    【讨论】:

      【解决方案2】:

      我用一个事件过滤器解决了同样的问题(当鼠标进入它的一个孩子时,MouseExit 被发送到一个 Composite)。这是代码。

      public class MouseTracker implements Listener {
          static MouseTracker instance;
      
          private static class Item {
              Composite composite;
              boolean inside;
              MouseTrackListener listener;
          }
      
          private List<Item> listeners = new ArrayList<>();
      
          private MouseTracker() {
          }
      
          public static MouseTracker getInstance() {
              if (instance == null)
                  instance = new MouseTracker();
              return instance;
          }
      
          private void install() {
              Display.getCurrent().addFilter(SWT.MouseEnter, this);
              Display.getCurrent().addFilter(SWT.MouseExit, this);
              Display.getCurrent().addFilter(SWT.Resize, this);
          }
      
          private void uninstall() {
              Display.getCurrent().removeFilter(SWT.MouseEnter, this);
              Display.getCurrent().removeFilter(SWT.MouseExit, this);
              Display.getCurrent().removeFilter(SWT.Resize, this);
          }
      
          public void addMouseTrackListener(Composite c, MouseTrackListener listener) {
              if (listeners.isEmpty())
                  install();
              Item i = new Item();
              i.composite = c;
              i.inside = false;
              i.listener = listener;
              listeners.add(i);
          }
      
          public void removeMouseTrackListener(Composite c, MouseTrackListener listener) {
              listeners.removeIf((i) -> i.composite == c && i.listener == listener);
              if (listeners.isEmpty())
                  uninstall();
          }
      
          public void handleEvent(Event e) {
              boolean hasDisposed = false;
              for (Item i : listeners) {
                  Composite c = i.composite;
                  if (c.isDisposed())
                      hasDisposed = true;
                  else {
                      Point p = Display.getCurrent().getCursorLocation();
                      boolean containsMouse = c.getBounds().contains(c.getParent().toControl(p));
                      if (i.inside != containsMouse) {
                          i.inside = containsMouse;
                          if (containsMouse)
                              i.listener.mouseEnter(new MouseEvent(e));
                          else
                              i.listener.mouseExit(new MouseEvent(e));
                      }
                  }
              }
              if (hasDisposed) {
                  listeners.removeIf((i) -> i.composite.isDisposed());
                  if (listeners.isEmpty())
                      uninstall();
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 2019-06-20
        • 1970-01-01
        • 2013-05-04
        相关资源
        最近更新 更多