マウスの下にあるコンポーネントを追跡できるようにする必要があります。私がこれに取り組んでいるレガシープロジェクトでは、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));
}
}
}
'AncestorListener'を試しましたか? –
@CatalinaIslandありがとうございました。しかし、私はそうではありませんでしたが、これが必要な例があるかもしれません。つまり、親が動いたためにコンポーネントがマウスの下を移動しますが、ターゲットは親の境界内に固定されたままです。 – Adam