avril
2014
JavaFX supporte le contrôle clavier virtuel dans sa version embedded (pour Raspberry Pi) depuis septembre 2012. Il serait quand même temps de le tester puisque JavaFX 8 est désormais disponible.
Bizarrement, ce contrôle n’est pas activable (à ma connaissance) dans la version desktop. Il est quand même possible de simuler le fait d’être sur une version embeded de manière à provoquer l’apparition du clavier. Pour ce faire, il suffit, dans votre IDE, de paramétrer les options de lancement du programme de manière à inclure les paramètres suivants pour la JVM :
Apparemment le premier paramètre fait que JavaFX simulera désormais les événements clavier de manière logiciel et le second fait que les runtimes utiliseront un CSS (et probablement aussi des skins de contrôles) spécifique aux plateformes mobiles.
Exécutons le code suivant avec ces paramètres :
import java.util.Locale;
import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
/**
*
* @author fabriceb
*/
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
// Les modes actuellement supportés (voir doc).
final String[] keyboardLayouts = {
"numeric",
"url",
"email",
"text"
};
// On affiche tout dans une grille de type:
// Label1 TextField1
// Label2 TextField2
// Label3 TextField3
// Chaque champ texte a un mode de saisie différent.
final GridPane gridPane = new GridPane();
gridPane.setStyle("-fx-hgap: 6; -fx-vgap: 6; -fx-padding: 6");
// Préparation des lignes de la grille.
for (final String keyboardLayout : keyboardLayouts) {
final RowConstraints rowConstraints = new RowConstraints();
gridPane.getRowConstraints().add(rowConstraints);
}
// Préparation des colonnes de la grille.
for (int column = 0; column < 2; column++) {
final ColumnConstraints columnConstraints = new ColumnConstraints();
switch (column) {
case 0:
columnConstraints.setMinWidth(-1);
columnConstraints.setPrefWidth(-1);
columnConstraints.setMaxWidth(-1);
columnConstraints.setHgrow(Priority.NEVER);
columnConstraints.setHalignment(HPos.RIGHT);
break;
case 1:
default:
columnConstraints.setMinWidth(-1);
columnConstraints.setPrefWidth(-1);
columnConstraints.setMaxWidth(-1);
columnConstraints.setHgrow(Priority.ALWAYS);
}
gridPane.getColumnConstraints().add(columnConstraints);
}
// Remplissage de la grille.
for (int row = 0; row < keyboardLayouts.length; row++) {
final String keyboardLayout = keyboardLayouts[row];
final Label label = new Label(keyboardLayout);
GridPane.setRowIndex(label, row);
GridPane.setColumnIndex(label, 0);
TextField textField = new TextField();
// Configuration du clavier virtuel de ce champ de saisie.
textField.getProperties().put("vkType", keyboardLayout);
GridPane.setRowIndex(textField, row);
GridPane.setColumnIndex(textField, 1);
gridPane.getChildren().addAll(label, textField);
}
// Affichage.
final StackPane root = new StackPane();
root.getChildren().add(gridPane);
final Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Test clavier virtuel");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.printf("Default locale: %s", Locale.getDefault()).println();
final String[] properties = {
"com.sun.javafx.virtualKeyboard",
"com.sun.javafx.touch",
"user.country",
"user.language"
};
for (final String property : properties) {
System.out.printf("%s=%s", property, System.getProperty(property)).println();
}
launch(args);
}
}
Ce qui nous donne ceci :
Une interface avec plusieurs champs de saisie textuelle et un clavier virtuel spécifique à chacune d’entre elles. Lorsque notre application est active, une fois que le focus est récupéré par un des champs textes, un clavier virtuel apparaitra tout en bas de l’écran. il est possible de saisir des valeurs dans les champs avec le clavier physique ou en cliquant sur le clavier virtuel à la souris ou directement avec les doigts pour ceux disposant d’une interface tactile. Il est également possible de rétracter le clavier.
Note : étant donné que la gestion des fenêtres est différente d’entre le mode desktop et le mode mobile, parfois le clavier peut ne plus réapparaitre si on bascule d’une fenêtre à une autre ou une NullPointerException peut être levée.
Ce clavier fonctionne de manière similaire aux claviers disponibles sous Android ou iOS :
- Il est possible de maintenir son doigt (ou de simuler cela à la souris) sur une touche pour obtenir des lettres accentuées alternatives.
- Il est possible de basculer dans des modes de saisie alternatifs pour les chiffres ou les symboles.
- Il est possible de verrouiller la touche majuscule en appuyant plusieurs fois dessus.
- De plus il est possible de configurer des claviers avec des présentation différentes suivant les usages : nombres uniquement, mél, url, texte.
Par contre, je n’ai pas encore trouvé comment le faire basculer en affichage de clavier français même en forçant la locale à fr_FR via les paramètres de la JVM (mon système est en anglais australien avec un clavier physique US).
À l’usage on se rendra compte également que les champs texte eux-mêmes se comportent comme leurs contreparties sur version mobiles :
- Des coches de sélection peuvent apparaitre autour du texte sélectionné.
- Il est possible de déplacer ces coches avec les doigts (pas simulable à la souris).
- Il est possible d’avoir un menu popup sur la sélection pour les opérations de copier/coller/etc. (pas simulable à la souris).
Il en est de même avec les autres contrôles, une page de documentation est disponible chez Oracle et détaille le fonctionnement de certains contrôles ainsi que les éventuels changement visuels. Par exemple, les barres de scroll de ScrollView ne sont plus visibles en temps normal. Elles n’apparaissent qu’en cas de défilement. Même ainsi elles restent non-interactives puisque l’utilisateur est sensé effectuer le défilement uniquement avec ses doigts.
Je trouve qu’il reste dommage que ce clavier et ces modes de fonctionnent alternatifs pour les contrôles restent cantonnés à un usage sur plateformes embeded ou mobiles. En effet, même sur une plateforme desktop, il peut être intéressant d’utiliser ces contrôles et fonctionnalités dans le cadre de l’accessibilité aux personnes handicapées qui peuvent être amenées à utiliser un système de pointage pour interagir avec une UI (suivi des yeux par exemple).
Dans un usage plus courant, il n’est pas non-plus inhabituel d’imaginer des kiosques tactiles tournant en mode plein écran sous Windows par exemple et donc avec la version desktop de JavaFX. d’autant plus que certains contrôles ou certaines fonctionnalités utiles pour de tels kiosques ne sont pas pour le moment disponibles en version embedded. C’est le cas par exemple de WebView ou encore de MediaPlayer et du support des média ou de la 3D qui ne sont pas disponibles dans le profil embeded sur Raspberry Pi.
Commentaires récents
- Back from the future… dans
- Back from the future… dans
- Static linking = does not Compute dans
- Paquetage x 2 dans
- Why you little… dans