gpt4 book ai didi

java - 给定一个 Swing 容器和坐标,我如何找到制造的鼠标事件的源?

转载 作者:行者123 更新时间:2023-12-01 11:00:25 25 4
gpt4 key购买 nike

我有一个容器,例如 JFrame 或 JComponent。该容器可能包含诸如按钮、面板等可能具有鼠标监听器的组件。我想做的是创建一个 MouseEvent 并将其添加到系统事件队列中,即模拟用户在某个位置单击容器时发生的情况。我知道点击相对于容器的坐标,但我不知道容器的子代和孙代等是如何排列的。

到目前为止我所拥有的内容如下

    Component source = ????? ;
final MouseEvent ev = new MouseEvent(source, id, now, modifiers, x, y,
xAbs, yAbs, clickCount, popupTrigger, button) ;
SwingUtilities.invokeAndWait(new Runnable() {
@Override public void run() {
EventQueue q = Toolkit.getDefaultToolkit().getSystemEventQueue() ;
q.postEvent(ev);
} });

如果我能找到正确的子组件作为,这就有效。但我怎样才能做到这一点呢?

java.awt.Container中有一个名为getMouseEventTarget的方法,不幸的是它不是公开的。

我知道我可以使用 java.awt.Robot 执行类似的操作,但我不想实际移动鼠标指针。我希望能够在 headless 模式下执行此操作,我认为 Robot 不太可能工作。

<小时/>

编辑

这是我尝试的解决方案。它基于非公共(public)方法 java.awt.Container.getMouseEventTarget。我想找到一个更简单、更正确的解决方案。

static Triple<Component,Integer,Integer> searchForMouseEventSource( Component p, int x, int y ) {
synchronized( p.getTreeLock() ) {
return searchForMouseEventSourceImpl( p, x, y ) ;
}
}
static private Triple<Component,Integer,Integer> searchForMouseEventSourceImpl( Component comp, int x, int y ) {
// Based on getMouseEventTarget in java.awt.container
// Search for a descendant component that can take the event.
if( comp instanceof Container ) {
Container cont = (Container) comp ;
for (int i = 0; i < cont.getComponentCount(); i++) {
Component child = cont.getComponent(i) ;
if( child != null && child.isVisible() ) {
int childX = child.getX() ;
int childY = child.getY();
if( child.contains(x - childX, y - childY) ) {
Triple<Component,Integer,Integer> result
= searchForMouseEventSourceImpl( child, x-childX, y-childY );
if( result != null ) return result ;
}
}
}
}
// If we get here there, is no descendant that can take the event.
if( comp.contains(x,y) && takesMouseEvents( comp ) ) {
return new Triple<Component,Integer,Integer>( comp, x, y) ; }
else {
return null ; }
}

static boolean takesMouseEvents( Component comp ) {
// The following is what we want (from java.awt.Container)
//return (comp.eventMask & AWTEvent.MOUSE_MOTION_EVENT_MASK) != 0
// || (comp.eventMask & AWTEvent.MOUSE_EVENT_MASK) != 0
// || (comp.eventMask & AWTEvent.MOUSE_WHEEL_EVENT_MASK) != 0
// || comp.mouseListener != null
// || comp.mouseMotionListener != null
// || comp.mouseWheelListener != null;
// The next line covers the last 3 cases, I think.
return comp.getMouseListeners().length != 0
|| comp.getMouseMotionListeners().length != 0
|| comp.getMouseWheelListeners().length != 0 ;
}

static class Triple<T,U,V> {
public T first ;
public U second ;
public V third ;
public Triple( T first, U second, V third ) {
this.first = first ; this.second = second ; this.third = third ; }
}

最佳答案

This works if I can find the right subcomponent to be the source. But how can I do that?

Component child = container.getComponentAt( Point );

编辑:

这可能会满足您的要求:

Component child = SwingUtilities.getDeepestComponentAt(parent, x, y) 

关于java - 给定一个 Swing 容器和坐标,我如何找到制造的鼠标事件的源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33376305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com