Comment implémenter dans Web Forms une fonction semblable à "WIN_API_SHELL.SENDKEYS"
S'applique à
Oracle Forms - Version : 10.1.2 et ultérieures [Release : 10.1.2 et ultérieures ]
Les informations de ce document s'appliquent à toutes les plateformes.
Pertinence vérifiée le 15 août 2010
Accès sans navigateur à Oracle Forms 12c
Objectif
Ce document explique comment implémenter dans Web Forms une fonction semblable à "WIN_API_SHELL.SENDKEYS", utilisée dans la version client/serveur de Forms.
La classe Java "Robot" permet d'implémenter une fonction semblable en Java. Cette classe sert à générer des événements d'entrée natifs du système à des fins d'automatisation des tests, de démonstrations autonomes et d'autres applications qui nécessitent de contrôler la souris et le clavier.
Les références suivantes pourront vous aider à comprendre et à écrire votre premier code Java :
- Oracle9i Forms in a Java World (Ce livre blanc s'applique aussi à la version 10.1.2.0.2)
- Oracle Forms / Java tutorial - How to build a new JavaBean
- Oracle9i Forms - Developing PJCs a Quickstart
Voici également un exemple de code qui simule les touches "Enter" et "End" lorsque l'élément du formulaire
reçoit le focus. Vous pouvez aussi télécharger l'exemple de code ici.
Solution
1. Créez le fichier Java suivant, "SetFocus.java"
----------- SetFocus.java ----------------
import java.awt.Component;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.im.InputContext;
public class SetFocus extends FocusAdapter
{
public SetFocus() {
}
public void focusGained(FocusEvent fe) {
Component c = fe.getComponent();
InputContext inputContext = c.getInputContext();
}
}
2. Créez le fichier Java suivant, "FocusTextItem.java"
----------- FocusTextItem.java ----------------
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.im.InputContext;
import oracle.forms.handler.IHandler;
import oracle.forms.ui.VTextField;
import oracle.forms.properties.ID;
public class FocusTextItem extends VTextField {
public final static ID KEYEND = ID.registerProperty("KEYEND");
static int keyInput[] = {
KeyEvent.VK_END
};
static SetFocus focusAdapter;
public void init(IHandler ih)
{
super.init(ih);
focusAdapter = new SetFocus();
this.addFocusListener(focusAdapter);
System.out.println ("<< Init Text Item >>");
}
public boolean setProperty(ID property, Object value) {
if(property == KEYEND) {
System.out.println ("<< \"End\" property >>");
try{
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_END);
}
catch (AWTException e) { System.out.println(e.getStackTrace()); }
return true ;
}
else {
return super.setProperty(property, value);
}
}
}
3. Créez le fichier Java suivant, "FocusTextArea.java"
---------------FocusTextArea.java--------------------
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.im.InputContext;
import oracle.forms.handler.IHandler;
import oracle.forms.ui.VTextArea;
import oracle.forms.properties.ID;
public class FocusTextArea extends VTextArea
{
public final static ID KEYEND = ID.registerProperty("KEYEND");
static int keyInput[] = {
KeyEvent.VK_END
};
static SetFocus focusAdapter;
public void init(IHandler ih)
{
super.init(ih);
focusAdapter = new SetFocus();
this.addFocusListener(focusAdapter);
System.out.println ("<< Init Text Area >>");
}
public boolean setProperty(ID property, Object value)
{
if(property == KEYEND)
{
System.out.println ("<< \"End\" property >>");
try{
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_END);
}
catch (AWTException e)
{ System.out.println(e.getStackTrace()); }
return true ;
}
else
{
return super.setProperty(property, value);
}
}
}
4. Créez le fichier Java suivant, "PressButton.java"
----------- PressButton.java ----------------
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.im.InputContext;
import oracle.forms.handler.IHandler;
import oracle.forms.ui.VButton;
import oracle.forms.properties.ID;
public class PressButton extends VButton {
public final static ID KEY_ENTER = ID.registerProperty("ENTER");
static int keyInput[] = {
KeyEvent.VK_ENTER
};
static SetFocus focusAdapter;
public void init(IHandler ih)
{
super.init(ih);
focusAdapter = new SetFocus();
this.addFocusListener(focusAdapter);
System.out.println ("<< Init Push Button >>");
}
public boolean setProperty(ID property, Object value)
{
if(property == KEY_ENTER) {
System.out.println ("<< \"Enter\" property >>");
try{
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ENTER);
}
catch (AWTException e) {
System.out.println(e.getStackTrace());
}
return true ;
}
else {
return super.setProperty(property, value);
}
}
}
5) Compilez les fichiers Java pour générer les fichiers .class
- Ouvrez une invite de commandes et placez-vous dans le répertoire qui contient les fichiers .java
- Exécutez les commandes suivantes
set CLASSPATH=%ORACLE_HOME%\forms\java\frmall.jar;%CLASSPATH%
set ORACLE_HOME=path to your oracle home
%ORACLE_HOME%\jdk\bin\javac SetFocus.java
%ORACLE_HOME%\jdk\bin\javac FocusTextItem.java
%ORACLE_HOME%\jdk\bin\javac FocusTextArea.java
%ORACLE_HOME%\jdk\bin\javac PressButton.java
6. Créez un fichier jar pour les classes
%ORACLE_HOME%\jdk\bin\jar -cvf myKeys.jar SetFocus.class FocusTextItem.class FocusTextArea.class PressButton.class
7. Signez le nouveau fichier jar "myKeys.jar" et copiez-le dans
%ORACLE_HOME%\forms\java
8. Modifiez le fichier %ORACLE_HOME%\forms\server\formsweb.cfg
Ajoutez-y la section de configuration suivante.
[myKeys]
archive=frmall.jar,myKeys.jar
baseHTMLJInitiator=basejpi.htm
-OU -
si vous utilisez JInitiator, ajoutez ce qui suit :
[myKeysJinit]
archive_jini=frmall_jinit.jar,myKeys.jar
baseHTMLjinitiator=basejini.htm
La classe Java Robot fonctionne à partir de la version 1.3 de Java
9. Créez un nouveau formulaire avec les éléments suivants
Rendez-les visibles sur le canevas.
(a) DUMMY
(Propriété / Valeur)
Name: DUMMY
Item Type: Text Item
Width: 0
Height: 0
Assurez-vous que l'élément "DUMMY" est le premier élément navigable du bloc
(a) TEXT_ITEM
(Propriété / Valeur)
Name: TEXT_ITEM
Item Type: Text Item
Implementation Class: FocusTextItem
Initial Value: This is a test text item!!
Créez le trigger WHEN-NEW-ITEM-INSTANCE pour cet élément et ajoutez-y le code suivant :
Set_Custom_Property('CONTROL.TEXT_ITEM',1,'KEYEND','');
(b) TEXT_AREA
Propriété / Valeur
Name: TEXT_AREA
Item Type: Text Item
Multi-line: Yes
Implementation Class: FocusTextArea
Initial Value: This is a test text area!!
Créez le trigger WHEN-NEW-ITEM-INSTANCE pour cet élément et ajoutez-y le code suivant :
Set_Custom_Property('CONTROL.TEXT_AREA',1,'KEYEND','');
(b) BUT_ALERT
Propriété / Valeur
Name: BUT_ALERT
Item Type: Push Button
Implementation Class: PressButton
Créez le trigger WHEN-NEW-ITEM-INSTANCE pour cet élément et ajoutez-y le code suivant :
Set_Custom_Property('CONTROL.BUT_ALERT',1,'ENTER','');
Créez le trigger WHEN-BUTTON-PRESSED pour cet élément et ajoutez-y le code suivant :
MESSAGE('Hello World');
10. Exécutez le formulaire avec le JRE de Sun et la section "myKeys"
http://machin:port/forms/frmservlet?config=myKeys&form=formname.fmx
11. Naviguez entre les éléments au clavier ; vous constaterez que :
- Lorsque vous arrivez sur le Text Item ou le Text Area, le curseur se place à la fin du texte (effet de la touche End)
- Lorsque vous arrivez sur le bouton, un message s'affiche (effet de la touche Enter)