Ho inserito correttamente il mio codice Java in un'applicazione Oracle Forms in esecuzione, utilizzando DLL Injection e alcuni jni trickery. (Windows 7, 32 bit, Oracle Forms 11, Java JRE 8)Come scegliere un thread AWT-EventQueue, quando ce ne sono diversi
sono in grado di attraversare l'albero di componenti e per interrogare e impostare i valori in alcuni oggetti Java di base, come quelli dalla classe oracle.forms.ui.VTextField
sono bloccato quando si cerca di simulare clic dell'utente su un oracle.apps.fnd.ui.Button
ho provato 2 cose:
- chiamata al metodo della classe di
AbstractButton
- chiamata al metodo della classe
PushButton
simulatePush
(le 2 classi sono nella gerarchia delle classi per Button
) activate
I risultati sono stati identici: 1. In un primo momento, funziona benissimo: quando il pulsante è un Pulsante "Cerca", la ricerca viene eseguita e vengono visualizzati i risultati. 2. Quindi, interrompe immediatamente l'applicazione, con un pop-up che dice FRM-92100 Your connection to the Server was interrupted
.
Da lì, l'applicazione è bloccata.
Aggiornamento: Sembra che l'errore che causa una disconnessione dal server è:
java.lang.SecurityException: questo non è KeyboardFocusManager installata nel contesto del thread corrente java. awt.KeyboardFocusManager.checkCurrentKFMSecurity (fonte sconosciuta) a java.awt.KeyboardFocusManager.getGlobalFocusOwner (fonte sconosciuta) a java.awt.KeyboardFocusManager.processSynchronousLightweightTransfer (Sconosciuto Source) a sun.awt.windows.WComponentPeer.processSynchronousLightweightTransfer (Native Method) a sun.awt.windows.WComponentPeer.requestFocus (Sconosciuto Source) a java.awt.Component.requestFocusHelper (Origine Sconosciuta) A java.awt.Component .requestFocusHelper (Origine sconosciuta) a java.awt.Component.requestFocus (Origine sconosciuta) a oracle.forms.handler.UICommon.updateFocus (Origine sconosciuta) a oracle.forms.handler.UICommon.setFVP (Origine sconosciuta) a oracle.forms.handler.UICommon.setFVP (Fonte sconosciuta) a oracle.forms.handler.UICommon.onUpdate (Origine sconosciuta) a oracle.forms.handler.ComponentItem.onUpdate (Origine sconosciuta) a oracle.forms. handler.JavaContaine r.onUpdate (sorgente sconosciuta) a oracle.forms.handler.UICommon.onUpdate (sorgente sconosciuta) a oracle.forms.engine.Runform.onUpdateHandler (sorgente sconosciuta) a oracle.forms.engine.Runform.processMessage (sconosciuto fonte) a oracle.forms.engine.Runform.processSet (Origine sconosciuta) a oracle.forms.engine.Runform.onMessageReal (Origine sconosciuta) a oracle.forms.engine.Runform.onMessage (Origine sconosciuta) a Oracle .forms.engine.Runform.processEventEnd (sorgente sconosciuta) a oracle.ewt.lwAWT.LWComponent.redispatchEvent (Origine Sconosciuta) A oracle.ewt.lwAWT.LWComponent.processEvent (Origine Sconosciuta) A oracle.ewt.button.PushButton.activate (Origine Sconosciuta) A sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo natale) a sun.reflect.NativeMethodAccessorImpl.invoke (Origine sconosciuta) a sun.reflect.DelegatingMethodAccessorImpl.invoke (Origine sconosciuta) a java.lang.reflect.Method.invoke (Origine sconosciuta) a CustomAWT.run (CustomAWT.java:34) a java.awt.event.InvocationEvent.dispatch (Origine sconosciuta) a java.awt.EventQueue.dispatchEventImpl (Origine sconosciuta) a java.awt.EventQueue.access $ 400 (Fonte sconosciuta) a java.awt.EventQueue $ 2.run (fonte sconosciuta) a java.awt.EventQueue $ 2.run (Fonte sconosciuta) a java.security.AccessController.doPrivileged (metodo natale) a java.security.AccessControlContext $ 1.doIntersectionPrivilege (Sconosciuto Source) a java.awt.EventQueue.dispatchEvent (Origine sconosciuta) a java.awt.EventDispatchThread.pumpOneEventForFilters (fonte sconosciuta) a java.awt.EventDispatchThread.pumpEventsForFilter (fonte sconosciuta) a java.awt.EventDispatchThread.pumpEventsForHierarchy (sconosciuto source) a java.awt.EventDispatchThread. pumpEvents (sorgente sconosciuta) a java.awt.EventDispatchThread.pumpEvents (sorgente sconosciuta) a java.awt.EventDispatchThread.run (sorgente sconosciuta)
Il mio codice è qui: CustomAWT.run(CustomAWT.java:34)
e viene chiamato con invokeLater
. Il problema è probabilmente: quando si chiama il metodo oracle.ewt.button.PushButton.activate
, NON sono nell'EDT corretto.
Utilizzando "Elenco Threads" nella console Java, ho ottenuto:
Dump thread list ...
Group main,ac=30,agc=2,pri=10
main,5,alive
traceMsgQueueThread,5,alive,daemon
Timer-0,5,alive
Java Plug-In Pipe Worker Thread (Client-Side),5,alive,daemon
AWT-Shutdown,5,alive
AWT-Windows,6,alive,daemon
AWT-EventQueue-0,6,alive
SysExecutionTheadCreator,5,alive,daemon
CacheMemoryCleanUpThread,5,alive,daemon
CacheCleanUpThread,5,alive,daemon
Browser Side Object Cleanup Thread,5,alive
JVM[id=0]-Heartbeat,5,alive,daemon
Windows Tray Icon Thread,5,alive
Thread-13,5,alive
Group Plugin Thread Group,ac=3,agc=0,pri=10
AWT-EventQueue-1,6,alive
TimerQueue,5,alive,daemon
ConsoleWriterThread,6,alive,daemon
Group http://xxxx.xxxx.xxxxx.xx:8001/OA_JAVA/-threadGroup,ac=13,agc=0,pri=4
Applet 1 LiveConnect Worker Thread,4,alive
AWT-EventQueue-2,4,alive
thread applet-oracle/apps/fnd/formsClient/FormsLauncher.class-1,4,alive
Applet 2 LiveConnect Worker Thread,4,alive
thread applet-oracle.forms.engine.Main-2,4,alive
Forms-StreamMessageReader,4,alive
Forms-StreamMessageWriter,4,alive
HeartBeat,4,alive
Busy indicator,1,alive,daemon
TaskScheduler timer,4,alive
CursorIdler,4,alive
Thread-14,4,alive
Flush Queue,4,alive
Done.
Quindi, non v'è TREAWT-EventQueue
discussioni ... La domanda è ora: come Query/Retrieve quella giusta, e come fare il Runnable
passato a invokeLater
per l'esecuzione in "Good filo" (immagino che quello buono è l'ultimo (AWT-EventQueue-2
)
Hai provato con il parametro applet 'separatedFrame =" True "? – dan
@dan Non ho modo di cambiare nulla sul server. Non sono sicuro di capire cosa stai suggerendo. L'applicazione Oracle Forms (Oracle Application eBusiness Center) è già in esecuzione come finestra principale, figlio del Window Desktop. – manuell