我需要将自定义拼写检查器集成到现有的Java
应用程序中,而不需要Automation API
。
它应该像这样工作:
A
中,用户打开一个窗口,在其中输入一些文本。在那个窗口中有一个按钮“Spellchecker”。如何在外部Java
应用程序中检测到某个按钮被按下了?
更新1:我尝试安装自己的AWT事件监听器来检测其他应用程序中的事件。
Toolkit.getDefaultToolkit().addAWTEventListener(new MyAWTEventListener(), AWTEvent.MOUSE_MOTION_EVENT_MASK);
while (true)
{
Thread.sleep(1);
}
但它不起作用。
更新2:更换系统事件队列也不起作用。
private void queuePushingExperiment() throws InterruptedException,
InvocationTargetException {
EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
queue.push(new MyEventQueue());
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
System.out.println("run");
}
});
}
public class MyEventQueue extends EventQueue {
@Override
public SecondaryLoop createSecondaryLoop() {
System.out.println("createSecondaryLoop");
return super.createSecondaryLoop();
}
@Override
protected void dispatchEvent(AWTEvent event) {
System.out.println("dispatchEvent");
super.dispatchEvent(event);
}
@Override
public AWTEvent getNextEvent() throws InterruptedException {
System.out.println("getNextEvent");
return super.getNextEvent();
}
@Override
public AWTEvent peekEvent() {
System.out.println("peekEvent");
return super.peekEvent();
}
@Override
public AWTEvent peekEvent(int id) {
System.out.println("peekEvent");
return super.peekEvent(id);
}
@Override
protected void pop() throws EmptyStackException {
System.out.println("pop");
super.pop();
}
@Override
public void postEvent(AWTEvent theEvent) {
System.out.println("postEvent");
super.postEvent(theEvent);
}
@Override
public void push(EventQueue newEventQueue) {
System.out.println("push");
super.push(newEventQueue);
}
}
更新3: java.awt.Window.getOwnerlessWindows()
和EventQueueMonitor.getTopLevelWindows()
都返回空数组,即使在调用时有JFrame
打开。
更新4:我注意到我无法写入文件C:\Program Files\Java\jdk1.7.0_25\jre\lib\accessibility.properties
,目前行assistive_technologies=com.sun.java.accessibility.AccessBridge
已被注释掉。这可能会导致上述辅助功能对象出现问题。
答案 0 :(得分:4)
我怎样才能做到这一点?我认为对于每个Java程序都会启动一个单独的JVM。
实际上java app A可以从app B运行。你只需要调用A的main()方法。所以实际上你启动B.main()运行必要的B代码,然后调用A.main()来运行A.在这种情况下,你可以使用Window类方法启动窗口(或框架)。
public static Window[] getWindows()
之后,只需查看找到的窗口的所有子组件,检查它们的类,当您找到JButton
时,检查buton的文本或图像以查找必要的实例。然后在那里添加你的听众。