2010-04-28 12 views
10

Estoy trabajando para que una aplicación Java sea compatible con dispositivos de entrada alternativos. Desafortunadamente, el dispositivo en cuestión tiene una API de Java que apenas está en las etapas alfa en este momento, por lo que es bastante pobre. Lo que tengo que hacer es esencialmente configurar una estructura de reemplazo para el envío de MouseEvents. ¿Alguien sabe si hay una manera en Swing de tomar una coordenada de pantalla y descubrir qué componente de Swing se muestra en la parte superior en ese punto de la pantalla?¿Identifica el componente Swing en una determinada coordenada de pantalla? (Y despachando manualmente MouseEvents)

Respuesta

15

En AWT Container, llamar a este ...

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

es decir, si está en un 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; 
    } 

La lectura de su pregunta, esto podría ser de ayuda para usted también. ..

Si desea ejercer el control, use esto ... La clase Java.awt.Robot se utiliza para tomar el control del mouse y el teclado. Una vez que obtiene el control, puede realizar cualquier tipo de operación relacionada con el mouse y el teclado a través de su código java. Esta clase se usa generalmente para la automatización de pruebas.

+0

Gracias! Pensé que debía haber alguna llamada API, simplemente no estaba buscando lo suficiente en el árbol antepasado. Y escuchar acerca de la clase de Robot es una GRAN bonificación; No tenía idea de que existiera algo así, ¡y hay una buena posibilidad de que me salvases días de trabajo! – DVA

+0

@DVA Gracias por el comentario, la buena respuesta y la respuesta positiva es lo que hace que las personas respondan preguntas. Encantado de ayudar :) –

3

Una alternativa (puede ser necesario ajustar aún más):

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; 
} 
Cuestiones relacionadas