java.awt.eventdispatchthread_java – 如何选择一个AWT-EventQueue线程,当有几个

我成功地将自己的

Java代码注入到运行的Oracle Forms应用程序中,使用DLL注入和一些jni欺骗. (Windows 7,32位,Oracle Forms 11,JRE Java 8)

我可以遍历组件树,并查询和设置一些基本Java对象中的值,例如来自class oracle.forms.ui.VTextField的值

当我试图模拟用户点击oracle.apps.fnd.ui.Button时,我被卡住了

我试过2件事情:

>调用AbstractButton类的simulatePush方法

>调用PushButton类的activate方法

(2类在Button的类层次结构中)

结果相同:

首先,它工作正常:当按钮是“搜索”按钮时,搜索完成并显示结果.

然后,它立即中断应用程序,弹出一声说FRM-92100您与服务器的连接中断.

从那里,应用程序被挂起.

更新:

似乎导致与服务器断开连接的错误是:

java.lang.SecurityException: this KeyboardFocusManager is not

installed in the current thread’s context at

java.awt.KeyboardFocusManager.checkCurrentKFMSecurity(Unknown Source)

at java.awt.KeyboardFocusManager.getGlobalFocusOwner(Unknown Source)

at

java.awt.KeyboardFocusManager.processSynchronousLightweightTransfer(Unknown

Source) at

sun.awt.windows.WComponentPeer.processSynchronousLightweightTransfer(Native

Method) at sun.awt.windows.WComponentPeer.requestFocus(Unknown

Source) at java.awt.Component.requestFocusHelper(Unknown Source) at

java.awt.Component.requestFocusHelper(Unknown Source) at

java.awt.Component.requestFocus(Unknown Source) at

oracle.forms.handler.UICommon.updateFocus(Unknown Source) at

oracle.forms.handler.UICommon.setFVP(Unknown Source) at

oracle.forms.handler.UICommon.setFVP(Unknown Source) at

oracle.forms.handler.UICommon.onUpdate(Unknown Source) at

oracle.forms.handler.ComponentItem.onUpdate(Unknown Source) at

oracle.forms.handler.JavaContainer.onUpdate(Unknown Source) at

oracle.forms.handler.UICommon.onUpdate(Unknown Source) at

oracle.forms.engine.Runform.onUpdateHandler(Unknown Source) at

oracle.forms.engine.Runform.processMessage(Unknown Source) at

oracle.forms.engine.Runform.processSet(Unknown Source) at

oracle.forms.engine.Runform.onMessageReal(Unknown Source) at

oracle.forms.engine.Runform.onMessage(Unknown Source) at

oracle.forms.engine.Runform.processEventEnd(Unknown Source) at

oracle.ewt.lwAWT.LWComponent.redispatchEvent(Unknown Source) at

oracle.ewt.lwAWT.LWComponent.processEvent(Unknown Source) at

oracle.ewt.button.PushButton.activate(Unknown Source) at

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at

sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at

sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at

java.lang.reflect.Method.invoke(Unknown Source) at

CustomAWT.run(CustomAWT.java:34) at

java.awt.event.InvocationEvent.dispatch(Unknown Source) at

java.awt.EventQueue.dispatchEventImpl(Unknown Source) at

java.awt.EventQueue.access$400(Unknown Source) at

java.awt.EventQueue$2.run(Unknown Source) at

java.awt.EventQueue$2.run(Unknown Source) at

java.security.AccessController.doPrivileged(Native Method) at

java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown

Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at

java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown

Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at

java.awt.EventDispatchThread.run(Unknown Source)

我的代码在这里:CustomAWT.run(CustomAWT.java:34),并使用invokeLater调用.问题可能是:在调用oracle.ewt.button.PushButton.activate方法时,我不在正确的EDT.

在Java控制台中使用“列表线程”,我得到:

Dump thread list ...

Group main,ac=30,agc=2,pri=10

main,5,alive

traceMsgQueueThread,alive,daemon

Timer-0,alive

Java Plug-In Pipe Worker Thread (Client-Side),daemon

AWT-Shutdown,alive

AWT-Windows,6,daemon

AWT-EventQueue-0,alive

SysExecutionTheadCreator,daemon

CacheMemoryCleanUpThread,daemon

CacheCleanUpThread,daemon

Browser Side Object Cleanup Thread,alive

JVM[id=0]-Heartbeat,daemon

Windows Tray Icon Thread,alive

Thread-13,alive

Group Plugin Thread Group,ac=3,agc=0,pri=10

AWT-EventQueue-1,alive

TimerQueue,daemon

ConsoleWriterThread,daemon

Group http://xxxx.xxxx.xxxxx.xx:8001/OA_JAVA/-threadGroup,ac=13,pri=4

Applet 1 LiveConnect Worker Thread,4,alive

AWT-EventQueue-2,alive

thread applet-oracle/apps/fnd/formsClient/FormsLauncher.class-1,alive

Applet 2 LiveConnect Worker Thread,alive

thread applet-oracle.forms.engine.Main-2,alive

Forms-StreamMessageReader,alive

Forms-StreamMessageWriter,alive

HeartBeat,alive

Busy indicator,1,daemon

TaskScheduler timer,alive

CursorIdler,alive

Thread-14,alive

Flush Queue,alive

Done.

所以,有三个AWT-EventQueue线程…问题现在:如何查询/检索正确的一个,以及如何使Runnable传递给invokeLater运行在“好线程”(我猜,好的是最后一个(AWT-EventQueue-2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值