2016-12-22 7 views
0

マウスの下にあるコンポーネントを追跡できるようにする必要があります。私がこれに取り組んでいるレガシープロジェクトでは、mouseEntered()およびmouseExited()トリガーを使用するMouseListenerを使用していました。マウスが動かなくなったときにマウスの出入りをトリガする方法

しかし、これはマウスポインタが移動しない

  • 2つの角のケースをカバーしていないが、コンポーネントが下にマウスポインタが移動しない表示
  • から除去されるが、新しいコンポーネントは、マウスポインタ
  • 下に表示され

これは、ユーザーがマウスポインタを現在持っているものに関連するアプリケーションの他の場所にあるボタンが、関連するコンポーネントが消えても表示され続けることを意味します。通常、これはmouseExited()トリガを使用してクリーンアップされます。

これまでのところ、私が追跡したいコンポーネントにComponentListenerとHierarchyListenersを追加して、button.getMousePosition() != nullを使用しているマウスのチェックをトリガーしました。さらに、これを使用して合成MOUSE_ENTERイベントとMOUSE_EXITイベントを送出し、既存のレガシーコードを変更する必要はありません。

私はより単純な解決法が存在する場合、それを探しています。

public class MouseTracker { 

    private static int clock; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     Container content = frame.getContentPane(); 
     JButton button1 = new JButton("one"); 
     button1.setName("one"); 
     Timer timer = new Timer(2000, (e) -> { 
      content.removeAll(); 
      if (clock % 2 == 0) { 
       content.add(button1); 
      } 
      frame.revalidate(); 
      frame.repaint(); 
      clock++; 
     }); 
     timer.setRepeats(true); 
     timer.start(); 
     frame.setSize(200, 100); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     track(button1); 
    } 

    private static void track(JButton component) { 
     component.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseEntered(MouseEvent e) { 
       System.out.println("Mouse enter "); 
      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
       System.out.println("Mouse exit "); 
      } 
     }); 
     component.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentShown(ComponentEvent e) { 
       checkMouse(component); 
      } 

      @Override 
      public void componentHidden(ComponentEvent e) { 
       checkMouse(component); 
      } 

      @Override 
      public void componentResized(ComponentEvent e) { 
       checkMouse(component); 

      } 

      @Override 
      public void componentMoved(ComponentEvent e) { 
       checkMouse(component); 
      } 

     }); 
     component.addHierarchyListener(new HierarchyListener() { 
      @Override 
      public void hierarchyChanged(HierarchyEvent e) { 
       checkMouse(component); 
      } 
     }); 

    } 

    private static void checkMouse(JComponent component) { 
     Point mousePosition = component.getMousePosition(); 
     if (component.isShowing() && mousePosition != null) { 
      System.out.println("Equivalent mouse enter " + component.getName()); 
      component.dispatchEvent(new MouseEvent(component, MouseEvent.MOUSE_ENTERED, 0, 0, mousePosition.x, 
        mousePosition.y, 0, false)); 
     } else { 
      System.out.println("Equivalent mouse exit " + component.getName()); 
      component.dispatchEvent(new MouseEvent(component, MouseEvent.MOUSE_EXITED, 0, 0, 0, 0, 0, false)); 
     } 
    } 
} 
+0

'AncestorListener'を試しましたか? –

+0

@CatalinaIslandありがとうございました。しかし、私はそうではありませんでしたが、これが必要な例があるかもしれません。つまり、親が動いたためにコンポーネントがマウスの下を移動しますが、ターゲットは親の境界内に固定されたままです。 – Adam

答えて

0

現在提案されている解決策に固執しています。

private static void track(JButton component) { 
    component.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseEntered(MouseEvent e) { 
      System.out.println("Mouse enter "); 
     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      System.out.println("Mouse exit "); 
     } 
    }); 
    component.addComponentListener(new ComponentAdapter() { 
     @Override 
     public void componentShown(ComponentEvent e) { 
      checkMouse(component); 
     } 

     @Override 
     public void componentHidden(ComponentEvent e) { 
      checkMouse(component); 
     } 

     @Override 
     public void componentResized(ComponentEvent e) { 
      checkMouse(component); 

     } 

     @Override 
     public void componentMoved(ComponentEvent e) { 
      checkMouse(component); 
     } 

    }); 
    component.addHierarchyListener(new HierarchyListener() { 
     @Override 
     public void hierarchyChanged(HierarchyEvent e) { 
      checkMouse(component); 
     } 
    }); 

} 

private static void checkMouse(JComponent component) { 
    Point mousePosition = component.getMousePosition(); 
    if (component.isShowing() && mousePosition != null) { 
     System.out.println("Equivalent mouse enter " + component.getName()); 
     component.dispatchEvent(new MouseEvent(component, MouseEvent.MOUSE_ENTERED, 0, 0, mousePosition.x, 
       mousePosition.y, 0, false)); 
    } else { 
     System.out.println("Equivalent mouse exit " + component.getName()); 
     component.dispatchEvent(new MouseEvent(component, MouseEvent.MOUSE_EXITED, 0, 0, 0, 0, 0, false)); 
    } 
} 
関連する問題