IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Accessibilité de Swing aux non-voyants


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 127
    Par défaut Accessibilité de Swing aux non-voyants
    Bonjour,

    Je suis développeur et non-voyant depuis 2010.
    Je travaille essentiellement en Java et PHP
    Je me suis penché sur l'accessibilité des applications utilisant Swing
    Après avoir effectué ma reconversion professionnelle. J'ai repris un projet personnel basé sur Swing et hibernate.
    L’interface de mon projet s'est révélée inaccessible.
    Dans un premier temps j'ai cru, qu'il serait impossible de le rendre accessible.
    Après un peu de travail, j’ai pu régler la plus grande partie des problèmes.

    Je me demande si un article sur le sujet serait pertinent.
    Car cela ne demande pas beaucoup de travail.

    De plus la plateforme Java intègre un outil pour l'accessibilité, le JavaAccessBridge.
    Il suffit juste que les utilisateurs l’activent.

    Pour cela il faut
    • aller dans les "options d'ergonomie" avec la combinaison de touches Windows et u.
    • Puis aller dans "utiliser l'ordinateur sans écran"
    Puis cocher la case "activer le JavaAcessBridge".
    A partir de maintenant les lecteurs d'écran seront plus efficace, avec les applications Java Swing.

    Mais qu'est ce qu'un lecteur d'écran.
    Il s'agit d'un logiciel, qui permet aux non-voyants d'utiliser un ordinateur.
    Il vocalise les éléments à l'écran avec une synthèse vocale.
    La navigation se fait au clavier, avec la touche tabulation.
    D'éléments focusable en élément focusable.
    c'est pourquoi pour fonctionner un lecteur d'écran a besoin d'informations.
    Il vocalisera tout les éléments textuels, qui seront à sa porté.
    Mais pour cela il faut que l'application lui fournissent des élément à lire.
    C'est en partie une tâche, qui incombe aux développeurs.

    L’adaptation du code
    Les fenêtres
    En plus d’afficher sa fenêtre, avec setVisible(true) il est important de demander le focus, pour que le lecteur d’écran puisse annoncer le titre. Car c’est la première information, que lira le lecteur d'écran, pour les JFrame ,les JMdiFrame, ou les JInternalFrame, qui ont le focus.
    S’il n’est pas définit le lecteur d’écran annoncera cadre vide ou sans titre, cela peut être perturbant si ‘o’n navigue entre plusieurs applications sans titre.
    Il peut être intéressant d’ajouter en plus du titre une information sur les données chargées dans l’application, comme le nom du document, surtout s’il on peut ouvrir plusieurs fois l’application.
    Ensuite le lecteur d'écran va lire les informations du composant, qui a le focus, à l’intérieur de ce dernier. C’est pourquoi il est important de données le focus à l’élément, qui doit être utilisé en premier, avec requedstDefaultFocus().

    Association d’un composant à un label
    Lorsque le focus est sur un composant, le lecteur d’écran va par défaut annoncer une information sur le type du composant puis lire son contenu ou son état. Cependant il manque une information sur sa description. Car en général Pour définir un composant on place à coté un JLabel. Comme il n'est pas focussable, le lecteur d'écran l'ignore. C’est pourquoi il faut associer le composant avec le JLabel , qui le décrit. Et s'il n'y en a pas définir un ToolTipText ou bien les deux. Cela ne pose pas de problème car le lecteur d’écran n’en lira qu’un seul.
    Ainsi une fois le focus placé sur le composant le lecteur d'écran lira en plus le texte du JLabel associé, ce qui facilitera la navigation dans l’application.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    JTextField champsNom = new JTextField(25);
    champsNom.setToolTipText("Nom");
     
    JLabel label = new JLabel("Nom :");
    panel.add(label);
     
    label.setLabelFor(champsNom);
    panel.add(champsNom);
    champsNom.requestDefaultFocus();
    Sont concernés :
    • Les zones de texte (JTextField, JTextArea, .
    • Les JCheckBox.
    • Les boutons radios JRadioButton

    Ne sont pas concernés, car disposant d’un texte par défaut
    Les bouton JButton

    Les JTable
    Lorsque une JTable obtient le focus, les donnés qu’elle contient ne sont pas concernés par le focus. Il faut placé la selection sur une cellule de la JTable, de préférence aux coordonnées 0-0, car par défaut la JTable n’a pas de sélection, c’est pourquoi il faut cliquer avec la sourie pour commencer la saisie.
    tableModel.changeSelection(0,0) ;des données.

    Il faut savoir que pour sortir d’une JTable il faut appuyer sur la combinaison de touche CTRL plus tabulation.

    Les menus pop-up
    Il faut s’assurer que Les menus contextuels soient gérer à la fois à la sourie et au clavier
    Ace propos quand je gère la sourie j’affiche le menu aux coordonnées de la sourie. Mais je ne sais pas détecter ou est le curseur pour afficher le menu . Si quelqu’un sait.

    Les menusBar
    Par défaut la menu barre n’est pas accessible avec la touche alt , pour cela il faut utiliser la touche F10. Quand on appuie sur la touche alt on entre dans le menue de la fenêtre (fermer, agrandir, réduire,….). Si quelqu’un sait changer ce comportement.
    Conclusion
    Pour rendre une application Swing il faut :
    • Fournir des textes accessible
    • Donner le focus ou s’assurer qu’un élément a le focus.

    Il y a d’autres chose à faire pour l’accessibilité.
    Mais déjà avec ça une application swing est déjà plus accessible.

    Les idées de bases(associer les labels et les éléments graphiques), sont valables pour tous les toolkit graphiques,
    cependant il faut savoir que AWT et SWT sont plus accessibles car plus proche de la couche graphique native de Windows.
    Pensez-vous qu’un article, sur le sujet, peu se justifier ?
    Pensez-vous que tenir compte de ses informations dans votre code prendrait beaucoup de temps ?
    Seriez-vous prêt à le faire ?
    Rendre une application métier accessible permet de favoriser l’intégration de déficient visuels.



    Cordialement
    Fabrice
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Une très bonne idée que de faire partager ton expérience sur le sujet, vraiment très intéressant en plus. Peut-être pourrais-tu contribuer sous forme de tutoriels sur l'accessibilité en Java sur le site. Je transmets aux responsables de la rubrique.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Oui, ce serait je pense une très bonne idée que d'avoir un article portant sur accessibilité en Swing.

    Note : pour info complémentaire, l'accessibilité est actuellement complétement absente des versions stables de JavaFX et ne sera intégrée qu'à partir de la future 8u40 dans les mois qui viennent. Les exemples concernant cette future fonctionnalité de l'API sont encore très discrets ou carrément inexistants.

    Voir JEP 204: JavaFX Accessibility
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre chevronné
    Homme Profil pro
    web a11y
    Inscrit en
    Avril 2014
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : web a11y
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 192
    Par défaut
    +1 !
    Je ne peux que t'encourager à écrire ce genre d'article, tu es le mieux placé pour en parler.
    Je ne pense pas être le seul à être impliqué, au personnel et aussi au boulot, par rendre nos applications le plus accessible possible. Tes avis et conseils de premier choix ne peuvent qu'être bénéfiques.

    Ayant déjà eu à travailler avec des aveugles, à plusieurs reprises au cours des années, je sais à quel point c'est une relation importante pour comprendre ce qu'il se passe et comment mieux faire.

    Question : est-ce que finalement, l'accessibilité pourrait avoir son propre (sous-)forum ? Même si peu actif, il risque d'être régulièrement visité pour faire le point.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par CoderInTheDark Voir le message
    Les menus pop-up
    Il faut s’assurer que Les menus contextuels soient gérer à la fois à la sourie et au clavier
    Ace propos quand je gère la sourie j’affiche le menu aux coordonnées de la sourie. Mais je ne sais pas détecter ou est le curseur pour afficher le menu . Si quelqu’un sait.
    Le plus simple est de passer par setComponentPopupMenu() : le menu apparait directement là où est la souris, ou au centre sur SHIFT-F10. Par contre, les items de menus ne sont pas accessibles directement (au clavier) : il faut utiliser les inputMap et actionMap pour ça.

    Voici 2 exemples, un avec popup sur un JPanel, un avec sur une JTable. Dis-moi s'il manque quelque chose au niveau accessibilité. On fait apparaitre le menu par SHIFT-F10, et chacune des trois actions se fait par CTRL-1, CTRL-2 et CTRL-3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
     
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.ActionMap;
    import javax.swing.InputMap;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.KeyStroke;
    import javax.swing.SwingUtilities;
     
     
    public class DemoPopup extends JPanel {
     
    	private static final long serialVersionUID = 1L;
     
    	public static void main(String[] args) {
     
    		SwingUtilities.invokeLater(()-> demo());
     
    	}
     
    	public static void demo() {
     
    		JFrame frame =new JFrame("Démo Popup");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     
    		frame.setContentPane( new DemoPopup() );
     
    		frame.setJMenuBar(createMenuBar());
     
    		frame.setSize(200, 200);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static JMenuBar createMenuBar() {
     
    		JMenuBar menuBar = new JMenuBar();
     
    		menuBar.getAccessibleContext().setAccessibleName("Menus de la fenêtre");
    		menuBar.getAccessibleContext().setAccessibleDescription("Menu de la fenêtre");
     
    		JMenu menu = new JMenu("Mes menus");
    		menu.getAccessibleContext().setAccessibleName("Mes menus");
    		menu.getAccessibleContext().setAccessibleDescription("Tous les menus de la fenêtre");
     
    		menuBar.add(menu);
     
    		addAction( 
    				menu, 
    				"Menu 4", 
    				'1', 
    				KeyStroke.getKeyStroke(KeyEvent.VK_4, KeyEvent.CTRL_MASK), 
    				"Ceci est le menu 4",
    				(e)-> System.out.println("Menu 4 choisi")
    				);
     
    		return menuBar;
    	}
     
    	public DemoPopup() {
     
    		setFocusable(true); // le panel aura le focus
     
    		JPopupMenu popup = new JPopupMenu("Démo popup");
     
    		popup.getAccessibleContext().setAccessibleName("Menu contextuel");
    		popup.getAccessibleContext().setAccessibleDescription("Menu contextuel");
     
    		addAction( 
    				popup, 
    				"MENU1", 
    				"Menu 1", 
    				'1', 
    				KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.CTRL_MASK), 
    				"Ceci est le menu 1",
    				(e)-> System.out.println("Menu 1 choisi")
    				);
     
    		addAction( 
    				popup, 
    				"MENU2", 
    				"Menu 2", 
    				'2', 
    				KeyStroke.getKeyStroke(KeyEvent.VK_2, KeyEvent.CTRL_MASK), 
    				"Ceci est le menu 2",
    				(e)-> System.out.println("Menu 2 choisi")
    				);
     
    		addAction( 
    				popup, 
    				"MENU3", 
    				"Menu 3", 
    				'3', 
    				KeyStroke.getKeyStroke(KeyEvent.VK_3, KeyEvent.CTRL_MASK), 
    				"Ceci est le menu 3",
    				(e)-> System.out.println("Menu 3 choisi")
    				);
     
    		setComponentPopupMenu(popup);
     
    	}
     
    	private static void addAction( JMenu menu, String text, char mnemonic, KeyStroke accelerator, String accessibleDescription, ActionListener actionListener ) {
     
    		Action action = new ActionMenu( text, actionListener );
     
    		menu.add(createMenu(text, mnemonic, accelerator, accessibleDescription, action ));
     
    	}
     
    	private void addAction( JPopupMenu popupMenu, String command, String text, char mnemonic, KeyStroke accelerator, String accessibleDescription, ActionListener actionListener ) {
     
    		Action action = new ActionMenu( text, actionListener );
     
    		InputMap inputMap = getInputMap();
    		ActionMap actionMap = getActionMap();
     
    		actionMap.put( command , action );
    		inputMap.put( accelerator, command );
     
    		popupMenu.add(createMenu(text, mnemonic, accelerator, accessibleDescription, action ));
     
    	}
     
    	private static JMenuItem createMenu(String text, char mnemonic, KeyStroke accelerator, String accessibleDescription, Action action) {
    		JMenuItem menuItem = new JMenuItem(action);
    		menuItem.getAccessibleContext().setAccessibleName(text);
    		menuItem.getAccessibleContext().setAccessibleDescription(accessibleDescription);
    		menuItem.setMnemonic(mnemonic);
    		menuItem.setAccelerator(accelerator);
    		return menuItem;
    	}
     
    	private static class ActionMenu extends AbstractAction {
     
    		private static final long serialVersionUID = 1L;
     
    		private final ActionListener actionListener;
     
    		public ActionMenu(String name, ActionListener actionListener) {
    			super(name);
    			this.actionListener=actionListener;
    		}
     
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			actionListener.actionPerformed(e);
    		}
     
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
     
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.ActionMap;
    import javax.swing.InputMap;
    import javax.swing.JFrame;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.KeyStroke;
    import javax.swing.SwingUtilities;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;
     
     
    public class DemoPopupJTable extends JPanel {
     
    	private static final long serialVersionUID = 1L;
     
    	public static void main(String[] args) {
     
    		SwingUtilities.invokeLater(()-> demo());
     
    	}
     
    	public static void demo() {
     
    		JFrame frame =new JFrame("Démo Popup");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     
    		frame.setContentPane( new DemoPopupJTable() );
     
    		frame.setSize(200, 200);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	public DemoPopupJTable() {
     
    		setLayout(new BorderLayout());
     
    		JTable jtable = createTable();
    		jtable.setRowSelectionAllowed(false);
    		jtable.setColumnSelectionAllowed(false);
     
    		add(jtable.getTableHeader(), BorderLayout.NORTH);
    		add(new JScrollPane(jtable), BorderLayout.CENTER);
     
    		JPopupMenu popup = new JPopupMenu("Démo popup");
     
    		popup.getAccessibleContext().setAccessibleName("Menu contextuel");
    		popup.getAccessibleContext().setAccessibleDescription("Menu contextuel");
     
    		addAction( 
    				popup, 
    				jtable, 
    				"MENU1",
    				"Menu 1", 
    				'1', 
    				KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.CTRL_MASK), 
    				"Ceci est le menu 1",
    				(selection)-> System.out.println("Action du menu 1 sur " + selection)
    				);
     
    		addAction( 
    				popup, 
    				jtable, 
    				"MENU2",
    				"Menu 2", 
    				'2', 
    				KeyStroke.getKeyStroke(KeyEvent.VK_2, KeyEvent.CTRL_MASK), 
    				"Ceci est le menu 2",
    				(selection)-> System.out.println("Action du menu 2 sur " + selection)
    				);
     
    		addAction( 
    				popup, 
    				jtable, 
    				"MENU3",
    				"Menu 3", 
    				'3', 
    				KeyStroke.getKeyStroke(KeyEvent.VK_3, KeyEvent.CTRL_MASK), 
    				"Ceci est le menu 3",
    				(selection)-> System.out.println("Action du menu 3 sur " + selection)
    				);
     
    		jtable.setComponentPopupMenu(popup);
     
    	}
     
    	private JTable createTable() {
     
    		String[] columns = { "Colonne 1", "Colonne 2", "Colonne 3" };
     
    		Object[][] data = new Object[3][columns.length];
     
    		for(int line = 0; line < data.length; line++) {
    			for(int column = 0; column < data[line].length; column++ ) {
    				data[line][column] = "Cell " + (line+1) + ", " + (column+1);
    			}
    		}
     
    		TableModel model = new DefaultTableModel(data, columns) {
    			private static final long serialVersionUID = 1L;
    			public boolean isCellEditable(int row, int column) {
    				return false;
    			}
    		};
     
    		JTable table = new JTable(model);
     
    		return table;
     
    	}
     
    	private void addAction( JPopupMenu popupMenu, JTable table, String command, String text, char mnemonic, KeyStroke accelerator, String accessibleDescription, ITableAction tableAction ) {
     
    		Action action = new ActionMenu( text, table, tableAction );
     
    		InputMap inputMap = table.getInputMap();
    		ActionMap actionMap = table.getActionMap();
     
    		actionMap.put( command , action );
    		inputMap.put( accelerator, command );
     
    		popupMenu.add(createMenu(text, mnemonic, accelerator, accessibleDescription, action ));
     
    	}
     
    	private JMenuItem createMenu(String text, char mnemonic, KeyStroke accelerator, String accessibleDescription, Action action) {
    		JMenuItem menuItem = new JMenuItem(action);
    		menuItem.getAccessibleContext().setAccessibleName(text);
    		menuItem.getAccessibleContext().setAccessibleDescription(accessibleDescription);
    		menuItem.setMnemonic(mnemonic);
    		menuItem.setAccelerator(accelerator);
    		return menuItem;
    	}
     
    	private static class ActionMenu extends AbstractAction {
     
    		private static final long serialVersionUID = 1L;
     
    		private final ITableAction tableAction;
     
    		private final JTable table;
     
    		public ActionMenu(String name, JTable table, ITableAction tableAction) {
    			super(name);
    			this.table=table;
    			table.getSelectionModel().addListSelectionListener((e)-> selectionChange());
    			evalEnabled();
    			this.tableAction=tableAction;
    		}
     
    		private Object getSelection() {
    			return table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
    		}
     
    		private void selectionChange() {
    			evalEnabled();
    		}
     
    		private void evalEnabled() {
    			if ( isSelectionValid() ) {
    				setEnabled(true);
    			}
    			else {
    				setEnabled(false);
    			}
    		}
     
    		private boolean isSelectionValid() {
    			return table.getSelectedRowCount()==1 && table.getSelectedColumnCount()==1;
    		}
     
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			if ( isSelectionValid() ) {
    			   tableAction.processSelection(getSelection());
    			}
    		}
     
    	}
     
    	private static interface ITableAction {
     
    		void processSelection(Object selection);
     
    	}
     
    }
    Citation Envoyé par CoderInTheDark Voir le message
    Les menusBar
    Par défaut la menu barre n’est pas accessible avec la touche alt , pour cela il faut utiliser la touche F10. Quand on appuie sur la touche alt on entre dans le menue de la fenêtre (fermer, agrandir, réduire,….). Si quelqu’un sait changer ce comportement.
    Je ne sais pas si on peut changer ça : c'est un comportement propre à Windows.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 127
    Par défaut
    Merci pour le code.
    Je vais avoir deux journées un peu chargés .
    Je vais tester en fin de semaine.
    Je vai faire un retour après.

    On a aussi évoqué, Fx.
    je n'ai pas encore éssayé , son accessibilité..

    Mais Fx, n'est pas un concurrent direct de Swing.
    C'est juste les clients lourds comme swing qui sont en perte de vitesse.
    Mais il ya beaucoup de petites applications à adapter
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Concernant JavaFX 2.x-8.x, pour le moment il n'y a donc rien a part la présence de la propriété labelFor sur les contrôles de type Label. Évidement, il est possible de mettre des infobulles sur les contrôles via leur propriété tooltip sur les contrôles qui la supportent et il n'est pas bien compliqué de rajouter des infobulles sur les nœuds qui ne le supportent pas de base. Les entrées dans les menus disposent de la propriété accelerator pour définir la combinaison servant de raccourci clavier ainsi que de la propriété mnemonicParsing qui indique si l'API doit chercher un caractère '_ ' dans le texte du menu et prendre le caractère immédiatement après pour servir de caractère d'appel lors de la navigation au clavier dans le menu.

    Je n'ai jamais testé de faire poper des menu contextuels au clavier et je ne sais pas trop ce qu'il en est pour les barres de menu ou d'outils.

    À partir de JavaFX 8_u40 (ici, les liens donnés sont vers la doc de JavaFX 9, qui contient les classes rajoutées dans la u40), on aura, en théorie, un support complet de l'accessibilité sur les contrôles de base déjà existants. Nous aurons, de plus, toutes les briques nécessaires pour que le programmeur puisse intégrer le support de l’accessibilité dans des contrôles customisés.

    Évidement, ce que je dis ici et les bouts de code postés sont théoriques, je n'ai pas encore testé, ni n'ai les moyens de le faire (pas de screen reader ni de personne nécessitant ces assistants pour lui demander de tester) et je n'ai pas encore vu d'articles ou de didacticiel indiquant comment cela fonctionne.

    Plusieurs nouvelles enum :
    • AccessibleAction - une enum qui décrit les actions que peut effectuer un assistant d'accessibilité (ex: un screen reader).

      Par exemple, en théorie, il devrait être possible que l'assistant puisse effectuer le code suivant sur un Accordeon pour demander à ce que ce dernier se replie.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      accordeon.executeAccessibleAction(AccessibleAction.COLLAPSE);
    • AccessibleAttribute - une enum qui décrit les notifications à envoyer à un assistant d'accessibilité.

      Par exemple, si un Slider change de valeur, désormais elle devrait automatiquement émettre l'attribut suivant ce qui avertira l'assistant que la valeur a changé :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      notifyAccessibleAttributeChanged(AccessibleAttribute.VALUE);
    • AccessibleRole - une enum qui permet d'affecter un role predefini a un nœud graphique.

      Par exemple, on peut supposer que lors de sa création, un Button fasse :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      setAccessibleRole(AccessibleRole.BUTTON);


    La classe Node (classe parente de tous les nœuds graphiques), s'est vu adjoindre plusieurs nouvelles propriétés (avec donc les getters et setters qui vont avec) :
    • accessibleHelp - une chaine de texte décrivant l'aide pour l'utilisation de ce nœud. D’après la documentation, si le bouton dispose d'un Tooltip, c'est ce texte qui sera utilisé (dans l'infobulle si on a pas positionné de texte dessus ?? La doc n'est pas claire.)
    • accessibleRoleDescription - une chaine de texte décrivant le rôle de ce nœud. Lorsque le reader décrit le contrôle, il utilise des phrases par défaut pour les différents rôles. Cette propriété permet de spécifier une phrase customisée pour un rôle donné.
    • accessibleRole - la valeur du rôle de type AccessibleRole. Le rôle détermine les attributs et actions d'accessibilité qui sont supportés pour ce nœud.
    • accessibleText - le texte utilisé par le screen reader pour décrire ce nœud. Par exemple, si on met une valeur dans cette propriété, alors le reader dira cette valeur plutôt que le texte qui est sur le bouton.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      button.setText("Valider");
      button.setAccessibleText("Le bouton valider");
      Ici, le reader lira "Le bouton valider" au lieu de "Valider";


    Et des méthodes supplémentaires pour utiliser l'accessibilité :



    Pour le reste j'ignore comment cela s'interface avec le système. En théorie, cela devrait être automatique dès que le support de l’accessibilité est activé dans l'OS.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 127
    Par défaut
    Java intègre bien une API d'accessibilité
    http://docs.oracle.com/javase/7/docs...ess/jaapi.html
    Un peu rebutante

    Elle est utilisé dans le code posté, ci dessus.

    Quand le javaaceesbridge est activé, elle se débrouille toute seule comme une grande dans beaucoup de

    C'est pourquoi je voulais mettre en avant, qu'en ajoutant certain bouts de codes, on peut l'aider à lire les informations à l'utilisateur.
    De plus cela améliore l'ergonomie de l'application
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 913
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 913
    Billets dans le blog
    54
    Par défaut
    Non, bien que certains types aient des noms identiques, il s'agit ici d'une nouvelle implémentation totalement indépendante de Java Accessiblitity. Cette nouvelle implémentation est bien moins grosse puisque d'ailleurs seules AccessibleRole et AccessibleAction sont repris dans la nouvelle API propre a FX (et encore dans l'extension Java Accessiblitity ce sont des classes, tandis qu'ici ce sont des enums), toutes les autres classes sont absentes. Le seul nouvel ajout est AccessibleAttribute qui remplace les classes spécialisées précédemment présentes dans AccessibleAttributeSet.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Un programme informatique pour permettre aux non-voyants de voir ?
    Par Arsene Newman dans le forum Actualités
    Réponses: 2
    Dernier message: 10/03/2014, 16h19
  2. Pas de messages d'erreurs aux "non-admin"
    Par flenoir dans le forum Sécurité
    Réponses: 2
    Dernier message: 07/12/2007, 08h37
  3. [Joomla!] Template Accessible aux non-voyants
    Par kurkaine dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 15/03/2007, 08h19
  4. [SWING] JList non sélectionnable ?
    Par schneidb dans le forum Composants
    Réponses: 4
    Dernier message: 17/02/2006, 14h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo