2010-04-28 2 views
10

Je fais du travail pour rendre une application Java compatible avec d'autres périphériques d'entrée. Malheureusement, le périphérique en question a une API Java qui est à peine dans les étapes alpha en ce moment, donc c'est assez pauvre. Ce que je dois faire est essentiellement de mettre en place une structure de remplacement pour l'envoi de MouseEvents. Est-ce que quelqu'un sait s'il existe un moyen dans Swing de prendre une coordonnée d'écran et de découvrir quel composant Swing est affiché en haut à ce point d'écran?Identification du composant Swing à une coordonnée d'écran particulière? (Et envoi manuel de MouseEvents)

Répondre

15

Dans AWT Container, appelez ce ...

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

-à-dire si elle est dans 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 lecture de votre question, cela pourrait être utile à vous aussi.

Si vous souhaitez exercer le contrôle, utilisez-le ... Java.awt.La classe Robot est utilisée pour prendre le contrôle de la souris et du clavier. Une fois que vous obtenez le contrôle, vous pouvez faire n'importe quel type d'opération liée à la souris et au clavier grâce à votre code java. Cette classe est généralement utilisée pour l'automatisation des tests.

+0

Merci! Je pensais qu'il devait y avoir un appel API, je ne regardais pas assez loin l'arbre des ancêtres. Et entendre parler de la classe Robot est un énorme bonus; Je n'avais aucune idée que quelque chose comme ça existait, et il y a de bonnes chances que tu m'ais sauvé des jours de travail! – DVA

+0

@DVA Merci pour le commentaire, Les bons commentaires et l'upvote sont ce qui permet aux gens de répondre aux questions. Heureux de vous aider :) –

3

Une alternative (peut nécessiter plus de peaufinage):

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; 
} 
Questions connexes