Keyboardevent sturen naar een java applet

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Dolan
  • Registratie: Januari 2007
  • Laatst online: 21-09 17:54
Ik weet dat ik met Javascript een keyboardevent kan afvangen, maar waar ik niet uit kom is hoe ik vervolgens in een javaapplet dat keyboardevent kan invoeren. Ik heb nu een java applet die luistert naar de cijfertoetsen op het toetsenbord, maar om dat te laten functioneren moet je eerst op de applet klikken en dat doen de meeste mensen niet.

Ik heb al beetje rond lopen googlen, maar dan vind ik alleen hoe het naar silverlight kan:

https://silverlight.net/forums/t/25646.aspx

De applet draait trouwens in een iframe (kan niet anders, moet van het CMS). Iemand een ander idee hoe ik dit kan doen?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Is gewoon de focus zetten niet makkelijker?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Dolan
  • Registratie: Januari 2007
  • Laatst online: 21-09 17:54
RobIII schreef op donderdag 05 maart 2009 @ 11:52:
Is gewoon de focus zetten niet makkelijker?
Ja en nee, er moet namelijk ook (voor mensen die het toetsenbord niet snappen) een apart invoerveldje komen zodat de getallen aan te klikken zijn. Die gaan dan de keyboardevents genereren, maar de java-applet wijs maken dat het een keyboardevent is is nog het lastige puntje.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Als dat invoerveldje in het applet zit is dat toch geen probleem?

Zou je je probleem, maar vooral ook de bijbehorende situatie eens wat uitgebreider kunnen uitleggen? Dus niet enkel neerplempen dat je keyevents wilt doorsturen, maar de achterliggende wens. Wat wil je uberhaupt met het applet bereiken?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Dolan
  • Registratie: Januari 2007
  • Laatst online: 21-09 17:54
Janoz schreef op donderdag 05 maart 2009 @ 13:03:
Als dat invoerveldje in het applet zit is dat toch geen probleem?

Zou je je probleem, maar vooral ook de bijbehorende situatie eens wat uitgebreider kunnen uitleggen? Dus niet enkel neerplempen dat je keyevents wilt doorsturen, maar de achterliggende wens. Wat wil je uberhaupt met het applet bereiken?
Excuus,

Het applet is op dit moment niet aan te passen omdat die een aantal jaren geleden aangeleverd is. We hebben de source niet (of in ieder geval ik niet).

De applet is niks meer dan een teletekst viewer. Via de volgende code embedden we 'm:

code:
1
2
3
4
5
6
7
8
9
10
<applet archive="TssView.jar" CODE="TSSView.class" CODEBASE="http://domeinnaametc/" id="txtView" height="<?php echo($height); ?>"  width="<?php echo($width); ?>" align="top" MAYSCRIPT VIEWASTEXT>
<PARAM NAME = CODE VALUE = "TSSView.class" > 
<PARAM NAME="txtsub" VALUE="00">
<PARAM NAME="font" VALUE="vtx10x12.gif">
<PARAM NAME="channel" VALUE="pages">
<PARAM NAME="txtpage" VALUE="<?php echo($_GET['pagina']); ?>">
<PARAM NAME="bgcolor" VALUE="000000">
<PARAM NAME="showbuttons" VALUE="false">
<PARAM NAME="name" VALUE="teletekstapplet">
</applet>


Ik ben op dit moment wat aan het proberen met een reload event van de iframe, alleen heeft het iframe geen id of naam. In mijn test maak ik ff een los bestandje met een iframe met een id. Dit kunnen we misschien in het CMS aanpassen, maar het mooiste zou zijn om direct met 'teletekstapplet' te kunnen communiceren. De param showbuttons staat express op false omdat er niet genoeg ruimte is om die weer te geven.

Dus kort samengevat: ik wil los van het feit of de gebruiker de applet aangeklikt heeft van buiten de applet cijfers kunnen invoeren. De applet luistert naar het toetsenbord (als het applet focus heeft), dus lijkt het mij het beste om een keyboardevent te genereren. In mijn test reload ik de iframe (en dus ook de applet) met een ander paginanummer.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Als eerste wil ik even opmerken dat de applet tag al een tijdje niet meer gebruikt wordt. Je kunt veel beter de object tag gebruiken. Hoe dat moet kun je via google wel vinden.

Het is jammer dat je de code niet hebt van het applet. Het is namelijk keurig mogelijk om met javascript methodes van het applet aan te roepen. Die keyevents is natuurlijk een ranzige omweg. Het zou veel netter (en makkelijker) zijn wanneer je gewoon tssView.setPage(123) kunt doen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Dolan
  • Registratie: Januari 2007
  • Laatst online: 21-09 17:54
Janoz schreef op donderdag 05 maart 2009 @ 13:31:
Als eerste wil ik even opmerken dat de applet tag al een tijdje niet meer gebruikt wordt. Je kunt veel beter de object tag gebruiken. Hoe dat moet kun je via google wel vinden.

Het is jammer dat je de code niet hebt van het applet. Het is namelijk keurig mogelijk om met javascript methodes van het applet aan te roepen. Die keyevents is natuurlijk een ranzige omweg. Het zou veel netter (en makkelijker) zijn wanneer je gewoon tssView.setPage(123) kunt doen.
Ben ik het helemaal mee eens. Ik zal eens kijken of de source te achterhalen valt maar dat valt hier (op dit moment) nog niet mee. Ik heb trouwens al iets werkend á la setpage, maar dan via javascript die het iframe reload en een paginanummer meegeeft. Dit werkt al goed. Nu ga ik hier even bitchen of ze het CMS een trap kunnen geven om een id aan het bijbehorende iframe te geven. En dan kunnen ze later als ze tijd hebben de source van de applet aanpassen. }:O

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

De source is ook wel met een decompiler te achterhalen. Je hebt immers alleen maar de mogelijke public methodes nodig, dus erg net hoeft de code niet te zijn.

Het niet hebben van een id hoeft natuurlijk geen beperking te zijn. Er zijn ook wel andere manieren om met javascript een specifiek element in de dom tree op te zoeken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Dolan
  • Registratie: Januari 2007
  • Laatst online: 21-09 17:54
Janoz schreef op donderdag 05 maart 2009 @ 14:25:
De source is ook wel met een decompiler te achterhalen. Je hebt immers alleen maar de mogelijke public methodes nodig, dus erg net hoeft de code niet te zijn.

Het niet hebben van een id hoeft natuurlijk geen beperking te zijn. Er zijn ook wel andere manieren om met javascript een specifiek element in de dom tree op te zoeken.
Ik kwam er ineens achter dat ons CMS ook kon includen. Ineens verdwenen al mijn problemen als sneeuw voor de zon. Het werkt echt perfect nu, maar nog wel via een smerige omweg: het iframe reloaden. Bedankt in ieder geval!

Acties:
  • 0 Henk 'm!

  • Dolan
  • Registratie: Januari 2007
  • Laatst online: 21-09 17:54
Nou, ik heb toch besloten om die smerige omweg eruit te knallen. Ik heb de applet met een decompiler uit elkaar gehaald en de methode gevonden die de paginanummers veranderd. Deze methode heeft de geweldige naam: "SetPageNumber".

Welnu, javascriptje aangepast dat ie i.p.v. iframe reload deze methode aanroept. Daarvoor moest de applet tag inderdaad verdwijnen en is het een object tag geworden. Maar nu zit ik met een ander probleem:

code:
1
2
3
4
5
6
7
8
9
10
<object archive="TssView.jar" CODE="TSSView.class" CODEBASE="http://www.domeinnaam.nl/teletekst" id="txtView" height="<?php echo($height); ?>"  width="<?php echo($width); ?>" align="top" MAYSCRIPT VIEWASTEXT>
<PARAM NAME = CODE VALUE = "TSSView.class" > 
<PARAM NAME="txtsub" VALUE="00">
<PARAM NAME="font" VALUE="vtx10x12.gif">
<PARAM NAME="channel" VALUE="pages">
<PARAM NAME="txtpage" VALUE="<?php echo($page); ?>">
<PARAM NAME="bgcolor" VALUE="000000">
<PARAM NAME="showbuttons" VALUE="false">
<PARAM NAME="name" VALUE="GLD TxT">
</object>


Dit is nog niet helemaal correct, maar zo functioneert 'ie in ieder geval perfect in Internet Explorer. Firefox laat de applet zo niet zien. Na wat rond googlen kwam ik erachter dat i.p.v. de <embed> tag firefox ook <object> kent, maar dan net anders:

code:
1
2
3
4
5
6
7
8
9
10
<object codetype="application/java" classid="java:TSSView.class" archive="TssView.jar" CODE="TSSView.class" CODEBASE="http://www.domeinnaam.nl/teletekst" id="txtView" height="<?php echo($height); ?>"  width="<?php echo($width); ?>" align="top" MAYSCRIPT VIEWASTEXT>
<PARAM NAME = CODE VALUE = "TSSView.class" > 
<PARAM NAME="txtsub" VALUE="00">
<PARAM NAME="font" VALUE="vtx10x12.gif">
<PARAM NAME="channel" VALUE="pages">
<PARAM NAME="txtpage" VALUE="<?php echo($page); ?>">
<PARAM NAME="bgcolor" VALUE="000000">
<PARAM NAME="showbuttons" VALUE="false">
<PARAM NAME="name" VALUE="GLD TxT">
</object>


Nu laat firefox de applet wel zien, maar is deze via javascript niet aanspreekbaar. Paginanummer wijzigen werkt niet.

Nu had ik wel dit gevonden wat in elke browser moet werken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
      <!--[if !IE]> Firefox and others will use outer object -->
      <object classid="java:TSSView.class" 
            type="application/x-java-applet"
            archive="http://www.domeinnaam.nl/teletekst/TssView.jar" 
            height="<?php echo($height); ?>" 
            width="<?php echo($width); ?>" 
            txtpage="<?php echo($page); ?>" 
            id="txtView"
            txtsub="0"
            font="vtx10x12.gif"
            channel="pages"
            bgcolor="000000"
            showbuttons="false"
            scriptable="true">
      <!--<![endif]-->
        <!-- MSIE (Microsoft Internet Explorer) will use inner object --> 
        <object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" 
                codebase="http://www.domeinnaam.nl/teletekst"
                height="<?php echo($height); ?>" 
                width="<?php echo($width); ?>" 
                txtpage="<?php echo($page); ?>" 
                id="txtView"
                txtsub="0"
                font="vtx10x12.gif"
                channel="pages"
                bgcolor="000000"
                showbuttons="false"
                scriptable="true">
          <param name="code" value="TSSView.class" />
          <param name="archive" value="http://www.domeinnaam.nl/teletekst/TssView.jar" />

          <strong>
            This browser does not have a Java Plug-in.
            <br />
            <a href="http://java.sun.com/products/plugin/downloads/index.html">
              Get the latest Java Plug-in here.
            </a>
          </strong>
        </object> 
      <!--[if !IE]> close outer object -->
      </object>
      <!--<![endif]-->


In beide browsers start java nu, maar krijg ik in de console deze foutmelding:

code:
1
2
3
4
5
6
7
8
9
10
11
java.security.AccessControlException: access denied (java.net.SocketPermission www.mijneigentestdomeintje.nl resolve)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkConnect(Unknown Source)
    at sun.plugin.viewer.context.DefaultPluginAppletContext.getImage(Unknown Source)
    at java.applet.Applet.getImage(Unknown Source)
    at java.applet.Applet.getImage(Unknown Source)
    at TSSView.init(TSSView.java:73)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)


Wat ik niet snap is wat er nou zo heel anders is aan de laatste aanroep i.p.v. de 2 eerdere. De 2 eerdere lieten dus wel de applet zien en die draaide ook, alleen was bij 1 van de 2 de methode in de applet niet aanroepbaar via javascript.

Oh ja, javascript commando die ik gebruik is:

code:
1
document.txtform.txtView.SetPageNumber(waarde, 0);


Iemand een hintje in de juiste richting?
Pagina: 1