356 lines
14 KiB
HTML
356 lines
14 KiB
HTML
<html xmlns:o="urn:schemas-microsoft-com:office:office"
|
||
xmlns:w="urn:schemas-microsoft-com:office:word"
|
||
xmlns="http://www.w3.org/TR/REC-html40">
|
||
|
||
<head>
|
||
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
|
||
<meta name=ProgId content=Word.Document>
|
||
<meta name=Generator content="Microsoft Word 11">
|
||
<meta name=Originator content="Microsoft Word 11">
|
||
<link rel=File-List href="EventCallbacks_files/filelist.xml">
|
||
<title>Jacob can register Java classes for MS application events or callbacks</title>
|
||
<!--[if gte mso 9]><xml>
|
||
<o:OfficeDocumentSettings>
|
||
<o:RemovePersonalInformation/>
|
||
</o:OfficeDocumentSettings>
|
||
</xml><![endif]--><!--[if gte mso 9]><xml>
|
||
<w:WordDocument>
|
||
<w:DisplayBackgroundShape/>
|
||
<w:SpellingState>Clean</w:SpellingState>
|
||
<w:GrammarState>Clean</w:GrammarState>
|
||
<w:ValidateAgainstSchemas/>
|
||
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
|
||
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
|
||
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
|
||
<w:Compatibility>
|
||
<w:SelectEntireFieldWithStartOrEnd/>
|
||
<w:UseWord2002TableStyleRules/>
|
||
</w:Compatibility>
|
||
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
|
||
</w:WordDocument>
|
||
</xml><![endif]--><!--[if gte mso 9]><xml>
|
||
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
|
||
</w:LatentStyles>
|
||
</xml><![endif]-->
|
||
<style>
|
||
<!--
|
||
/* Style Definitions */
|
||
p.MsoNormal, li.MsoNormal, div.MsoNormal
|
||
{mso-style-parent:"";
|
||
margin:0in;
|
||
margin-bottom:.0001pt;
|
||
mso-pagination:widow-orphan;
|
||
font-size:12.0pt;
|
||
font-family:"Times New Roman";
|
||
mso-fareast-font-family:"Times New Roman";}
|
||
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
|
||
{margin:0in;
|
||
margin-bottom:.0001pt;
|
||
mso-pagination:widow-orphan;
|
||
font-size:10.0pt;
|
||
font-family:"Courier New";
|
||
mso-fareast-font-family:"Times New Roman";}
|
||
span.SpellE
|
||
{mso-style-name:"";
|
||
mso-spl-e:yes;}
|
||
span.GramE
|
||
{mso-style-name:"";
|
||
mso-gram-e:yes;}
|
||
@page Section1
|
||
{size:8.5in 11.0in;
|
||
margin:1.0in 65.95pt 1.0in 65.95pt;
|
||
mso-header-margin:.5in;
|
||
mso-footer-margin:.5in;
|
||
mso-paper-source:0;}
|
||
div.Section1
|
||
{page:Section1;}
|
||
/* List Definitions */
|
||
@list l0
|
||
{mso-list-id:369961789;
|
||
mso-list-type:hybrid;
|
||
mso-list-template-ids:-80199436 -1920937264 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
|
||
@list l0:level1
|
||
{mso-level-text:"%1\)";
|
||
mso-level-tab-stop:42.0pt;
|
||
mso-level-number-position:left;
|
||
margin-left:42.0pt;
|
||
text-indent:-24.0pt;}
|
||
@list l0:level2
|
||
{mso-level-tab-stop:1.0in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l0:level3
|
||
{mso-level-tab-stop:1.5in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l0:level4
|
||
{mso-level-tab-stop:2.0in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l0:level5
|
||
{mso-level-tab-stop:2.5in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l0:level6
|
||
{mso-level-tab-stop:3.0in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l0:level7
|
||
{mso-level-tab-stop:3.5in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l0:level8
|
||
{mso-level-tab-stop:4.0in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l0:level9
|
||
{mso-level-tab-stop:4.5in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l1
|
||
{mso-list-id:1316765558;
|
||
mso-list-type:hybrid;
|
||
mso-list-template-ids:860497186 -1920937264 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
|
||
@list l1:level1
|
||
{mso-level-text:"%1\)";
|
||
mso-level-tab-stop:42.0pt;
|
||
mso-level-number-position:left;
|
||
margin-left:42.0pt;
|
||
text-indent:-24.0pt;}
|
||
@list l1:level2
|
||
{mso-level-tab-stop:1.0in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l1:level3
|
||
{mso-level-tab-stop:1.5in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l1:level4
|
||
{mso-level-tab-stop:2.0in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l1:level5
|
||
{mso-level-tab-stop:2.5in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l1:level6
|
||
{mso-level-tab-stop:3.0in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l1:level7
|
||
{mso-level-tab-stop:3.5in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l1:level8
|
||
{mso-level-tab-stop:4.0in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
@list l1:level9
|
||
{mso-level-tab-stop:4.5in;
|
||
mso-level-number-position:left;
|
||
text-indent:-.25in;}
|
||
ol
|
||
{margin-bottom:0in;}
|
||
ul
|
||
{margin-bottom:0in;}
|
||
-->
|
||
</style>
|
||
<!--[if gte mso 10]>
|
||
<style>
|
||
/* Style Definitions */
|
||
table.MsoNormalTable
|
||
{mso-style-name:"Table Normal";
|
||
mso-tstyle-rowband-size:0;
|
||
mso-tstyle-colband-size:0;
|
||
mso-style-noshow:yes;
|
||
mso-style-parent:"";
|
||
mso-padding-alt:0in 5.4pt 0in 5.4pt;
|
||
mso-para-margin:0in;
|
||
mso-para-margin-bottom:.0001pt;
|
||
mso-pagination:widow-orphan;
|
||
font-size:10.0pt;
|
||
font-family:"Times New Roman";
|
||
mso-ansi-language:#0400;
|
||
mso-fareast-language:#0400;
|
||
mso-bidi-language:#0400;}
|
||
</style>
|
||
<![endif]-->
|
||
</head>
|
||
|
||
<body lang=EN-US style='tab-interval:.5in'>
|
||
|
||
<div class=Section1>
|
||
|
||
<p class=MsoPlainText>Jacob can register Java classes for MS application events
|
||
or callbacks.<span style='mso-spacerun:yes'><EFBFBD> </span>The normal flow for this
|
||
is:</p>
|
||
|
||
<p class=MsoPlainText><o:p> </o:p></p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l1 level1 lfo2;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>1)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]>Application thread creates an instance of the
|
||
event handler and registers it with Jacob</p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l1 level1 lfo2;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>2)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]>The application continues on doing other work.</p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l1 level1 lfo2;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>3)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]>Some time later, the MS application takes some
|
||
action and initiates the event callback.</p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l1 level1 lfo2;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>4)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]>The Java VM receives the event and spins up a
|
||
new thread to handle it.</p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l1 level1 lfo2;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>5)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]>The Jacob <span class=SpellE>EventProxy</span>
|
||
in the <span class=SpellE>dll</span> is called by the VM.</p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l1 level1 lfo2;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>6)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]>The Jacob <span class=SpellE>EventProxy</span>
|
||
creates Variant objects to handle the parameters of the passed in event.</p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l1 level1 lfo2;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>7)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]>The Jacob <span class=SpellE>EventProxy</span>
|
||
uses reflection to map the event name to a method name with the exact same
|
||
name.</p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l1 level1 lfo2;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>8)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]>The Jacob <span class=SpellE>EventProxy</span>
|
||
sends the message to the registered event handler.</p>
|
||
|
||
<p class=MsoPlainText><o:p> </o:p></p>
|
||
|
||
<p class=MsoPlainText>Swing developers should note that this message comes in
|
||
on a thread other than the event thread.<span style='mso-spacerun:yes'><EFBFBD>
|
||
</span>All objects receiving events that require user intervention or drawing
|
||
in the UI should use <span class=SpellE><span class=GramE>invokeLater</span></span><span
|
||
class=GramE>(</span>) to post requests for actions onto the event queue.<span
|
||
style='mso-spacerun:yes'><EFBFBD> </span>Failure to do so will insure random failures
|
||
in the GUI.</p>
|
||
|
||
<p class=MsoPlainText><o:p> </o:p></p>
|
||
|
||
<p class=MsoPlainText>Java Web Start (JWS) and other launchers can have
|
||
additional issues related to the class loader.<span style='mso-spacerun:yes'><EFBFBD>
|
||
</span>The Jacob C++ library uses <span class=SpellE><span class=GramE>FindClass</span></span><span
|
||
class=GramE>(</span>) to find the Variant class when building the parameter
|
||
list.<span style='mso-spacerun:yes'><EFBFBD> </span><span class=SpellE><span
|
||
class=GramE>FindClass</span></span><span class=GramE>(</span>) uses the system
|
||
class loader which includes only the classes specified at run time or in the
|
||
CLASSPATH.<span style='mso-spacerun:yes'><EFBFBD> </span>Most of the application
|
||
classes in this situation live in an alternate set of class loaders that were
|
||
created when the launcher located and ran the application classes.<span
|
||
style='mso-spacerun:yes'><EFBFBD> </span>This means that the search for Variant will
|
||
fail usually with the silent and immediate termination of the Java application.<span
|
||
style='mso-spacerun:yes'><EFBFBD> </span>The thread <span class=SpellE>classloader</span>
|
||
probably can<61>t be used to try and find the class because this new thread does
|
||
not have a <span class=SpellE>classloader</span> associated with it other than
|
||
the system class loader.<span style='mso-spacerun:yes'><EFBFBD> </span>The end result
|
||
is that the Variant class needs to be located via other means and that the
|
||
thread <span class=SpellE>classloader</span> should be set to be the context
|
||
class loader of the event handler class.</p>
|
||
|
||
<p class=MsoPlainText><o:p> </o:p></p>
|
||
|
||
<p class=MsoPlainText>The Jacob <span class=SpellE>EventProxy</span> class has
|
||
been modified (off of the 1.8 tree) so that it takes a two step approach to
|
||
towards fixing these problems.</p>
|
||
|
||
<p class=MsoPlainText><span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span></p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l0 level1 lfo4;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>1)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]>The <span class=SpellE>EventProxy</span>
|
||
constructor now accepts an extra object, an instance of the Variant class.<span
|
||
style='mso-spacerun:yes'><EFBFBD> </span>This gives the <span class=SpellE>EventProxy</span>
|
||
a way to get to the Variant class and thus to its <span class=SpellE>classloader</span>.
|
||
All of the callers of the constructor have been modified to pass a Variant
|
||
object to the <span class=SpellE>EventProxy</span> without programmer
|
||
intervention.</p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l0 level1 lfo4;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>2)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]><span class=SpellE>EventProxy</span> first
|
||
attempts to locate the Variant class using <span class=SpellE>FindClass</span>()</p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l0 level1 lfo4;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>3)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]>Failing that, it looks to see if a variant
|
||
object had been passed in. If so, it calls <span class=GramE>class(</span>) and
|
||
goes from there.<span style='mso-spacerun:yes'><EFBFBD> </span></p>
|
||
|
||
<p class=MsoPlainText style='margin-left:42.0pt;text-indent:-24.0pt;mso-list:
|
||
l0 level1 lfo4;tab-stops:list 42.0pt'><![if !supportLists]><span
|
||
style='mso-fareast-font-family:"Courier New"'><span style='mso-list:Ignore'>4)<span
|
||
style='font:7.0pt "Times New Roman"'>
|
||
</span></span></span><![endif]>If all that fails, it logs a message and then
|
||
fails in the spectacular fashion of the previous versions.</p>
|
||
|
||
<p class=MsoPlainText><o:p> </o:p></p>
|
||
|
||
<p class=MsoPlainText>Developers can receive call back events in JWS other Java
|
||
launching programs without implementing any additional code.<span
|
||
style='mso-spacerun:yes'><EFBFBD> </span>They should be aware that their callback
|
||
methods may need to set the class <span class=GramE>loader.:</span></p>
|
||
|
||
<p class=MsoPlainText><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>Public xxx <span
|
||
class=SpellE><span class=GramE>someHandler</span></span><span class=GramE>(</span>Variant[]
|
||
<span class=SpellE>foo</span>){</p>
|
||
|
||
<p class=MsoPlainText><span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span
|
||
class=SpellE><span class=GramE>Thread.currentThread</span></span><span
|
||
class=GramE>(</span>).<span class=SpellE>setContextClassLoader</span>(</p>
|
||
|
||
<p class=MsoPlainText><span style='mso-tab-count:3'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span><span
|
||
class=SpellE><span class=GramE>this.getClass</span></span><span class=GramE>(</span>).<span
|
||
class=SpellE>getClassLoader</span>());</p>
|
||
|
||
<p class=MsoPlainText><span style='mso-tab-count:2'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>// do
|
||
something</p>
|
||
|
||
<p class=MsoPlainText><span style='mso-tab-count:1'><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> </span>}</p>
|
||
|
||
<p class=MsoPlainText><o:p> </o:p></p>
|
||
|
||
<p class=MsoPlainText>There may still be a dual event queue issue in JWS
|
||
applications that needs to be looked at.</p>
|
||
|
||
<p class=MsoPlainText><o:p> </o:p></p>
|
||
|
||
</div>
|
||
|
||
</body>
|
||
|
||
</html>
|