Идентификация компонента Swing на определенной координате экрана? (И ручная отправка MouseEvents)

Я делаю некоторую работу, делая приложение Java совместимым с альтернативными устройствами ввода. К сожалению, у данного устройства есть Java API, который едва ли находится в альфа-стадиях прямо сейчас, поэтому он довольно беден. Что мне нужно сделать, так это создать структуру замещения для отправки MouseEvents. Кто-нибудь знает, есть ли способ в Swing взять координату экрана и узнать, какой компонент Swing отображается сверху на этом экране?

Ответ 1

В контейнере AWT вызовите это...

findComponentAt(int x, int y) 
          Locates the visible child component that contains the specified position

то есть. Если он находится в GlassPane...

  public static Component findComponentUnderGlassPaneAt(Point p, Component top) {
    Component c = null;

    if (top.isShowing()) {
      if (top instanceof RootPaneContainer)
        c =
        ((RootPaneContainer) top).getLayeredPane().findComponentAt(
            SwingUtilities.convertPoint(top, p, ((RootPaneContainer) top).getLayeredPane()));
      else
        c = ((Container) top).findComponentAt(p);
    }

    return c;
  }

Считывая ваш вопрос, это может помочь вам также...

Если вы хотите использовать элемент управления, используйте это... Класс Java.awt.Robot используется для управления мышью и клавиатурой. Как только вы получите элемент управления, вы можете выполнять любой тип операций, связанных с мышью и клавиатурой, через код Java. Этот класс обычно используется для автоматизации тестирования.

Ответ 2

Альтернатива (может потребовать дополнительной настройки):

public static Component findComponentUnderMouse() {
    Window window = findWindow();
    Point location = MouseInfo.getPointerInfo().getLocation();
    SwingUtilities.convertPointFromScreen(location, window);
    return SwingUtilities.getDeepestComponentAt(window, location.x, location.y);
}

private static Window findWindow() {
    for (Window window : Window.getWindows()) {
        if (window.getMousePosition(true) != null)
            return window;
    }

    return null;
}