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 :

Parcourir JLIST à l'aide du clavier


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut Parcourir JLIST à l'aide du clavier
    Bonjour,

    j'ai besoin de vous afin que vous puissiez m'aidez à comprendre la chose suivante :

    Je tape un mort dans un JTextArea et, à l'aide d'une fonction de complétion que je code, un JPopMenu dans laquelle se trouve un JList, s'ouvre et liste des mots qui sont suggérés à l'utilisateur. Bref, jusqu'à là tout va bien.....OUI MAIS non. En effet j'ai essayé de rajouter un keyListenner qui permet de parcourir (descendre ou monter) la liste mais cela ne marche pas. Non pas que j'ai une erreur, mais il ne se passe rien.

    voilà le code :

    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
     list.addKeyListener(new KeyAdapter(){
                	public void keyPressed(KeyEvent ke){
                	    if(ke.getKeyCode() == KeyEvent.VK_DOWN){
                	      ke.consume();
    //            	      list.setSelectedIndex(0);
                	      moveDown();
                	    }
                	 }
                });
     
            public void moveDown() {
                int index = Math.min(list.getSelectedIndex() + 1, list.getModel().getSize() - 1);
     
                System.out.print("INDEX OF KEYEVENT : " +index);
               // selectIndex(index);
            }
    En fait je crois comprendre le problème. En effet, quand je compile et lance mon programme, je peux parcourir ma liste à l'aide du clavier SI et seulement SI je clique sur la liste en premier.

    C'est à dire que je pense qu'il faudrait, sauf erreur de ma part, "activer" la JLIST à l'aide d'une ligne de code et ensuite pouvoir monter ou descendre dans la liste.


    Voilà voilà, dans l'attente d'une reponse, je vous passe le salut

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 977
    Points
    7 977
    Par défaut
    Vu qu'on a pas tout les details, peut être devrais tu chercher du cote du "focus" ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Vu qu'on a pas tout les details, peut être devrais tu chercher du cote du "focus" ?
    Merci de ta réponse. Malheureusement c'est toujours le même problème.... je n'arrive toujours pas à parcourir ma JLIST avec mon clavier sans cliqué au préalable dans celui-ci.

    voici-ci le code complet :

    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
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    package pckg.view;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Point;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.swing.BorderFactory;
    import javax.swing.JList;
    import javax.swing.JPopupMenu;
    import javax.swing.JTextArea;
    import javax.swing.ListSelectionModel;
    import javax.swing.SwingUtilities;
    import javax.swing.text.BadLocationException;
     
    public class Completion implements KeyListener {
     
        public class SuggestionPanel {
     
            private JPopupMenu popupMenu;
            private JList list;
    		private String prefix;
            private final int insertionPosition;
     
            /**
             * Getter
             * @return
             */
            public JList getList() {
       			return list;
       		}
     
            /**
             * Création du pannel qui servira à affciher la liste de suggestion
             * @param EqArea
             * @param position
             * @param prefix
             * @param location
             */
            public SuggestionPanel(JTextArea EqArea, int position, String prefix, Point location) {
                this.insertionPosition = position;
                this.prefix = prefix;
                popupMenu = new JPopupMenu();
                popupMenu.removeAll();
                popupMenu.setOpaque(false);
                popupMenu.setBorder(null);
                popupMenu.add(list = createsuggestion(position, prefix), BorderLayout.CENTER);
                popupMenu.show(	EqArea, location.x, EqArea.getBaseline(0, 0) + location.y);
                popupMenu.requestFocusInWindow();
            }
     
            /**
             * Si des suggestion existe alors celles-ci sont rengé dans une liste contenu par le Pannel de suggestion
             * @param position
             * @param subWord
             * @return
             */
            private JList<String> createsuggestion(final int position, final String subWord) {
                Object[] data = new Object[words.size()];
                for (int i = 0; i < words.size(); i++) {
                    data[i] = words.get(i);
                }
                list = new JList(data);
                list.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
                list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                list.setSelectedIndex(0);
                list.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        if (e.getClickCount() == 2) {
                            insertSelection();
                        }
                    }
                });
                return list;
            }
     
            public boolean insertSelection() {
                if (list.getSelectedValue() != null) {
                    try {
                        final String selectedSuggestion = ((String) list.getSelectedValue()).substring(prefix.length());
                        EqArea.getDocument().insertString(insertionPosition, selectedSuggestion, null);
                        return true;
                    } catch (BadLocationException e1) {
                        e1.printStackTrace();
                    }
                    //hideSuggestion();
                }
                return false;
            }
     
            public void moveDown() {
     
            	int index = Math.min(list.getSelectedIndex() + 1, list.getModel().getSize() - 1);
                System.out.print("INDEX OF KEYEVENT : " +index);
                //selectIndex(index);
            }
     
            public void moveUp() {
                int index = Math.min(list.getSelectedIndex() - 1, 0);
                System.out.print("INDEX OF KEYEVENT : " +index);
                //selectIndex(index);
            }
     
     
     
        }  
     
    	private JTextArea EqArea;
    	private SuggestionPanel suggestion;
    	private List<String> dictionary;
    	private List<String> words = new ArrayList <String>();
     
        /**
             * Getter & Setter
             * @return
             */
    	public List<String> getdictionary() {
    		return dictionary;
    	}
    	public void setdictionary(ArrayList<String> dictionary) {
    		this.dictionary = dictionary;
    	}
     
     
    	/**
             * Constructeur
             * @param EqArea
             */
    	public Completion(JTextArea EqArea){
       		this.EqArea=EqArea;
            EqArea.addKeyListener(this);
     
    	 }
     
    	/**
             * Methode de complétion
             * On propose une liste de mots ayant la même suite de caractères tapés par l'utilisateur
             */
    	protected void findSuggestion() {
     
    		words.clear();
     
    		//On recupère la position du dernier caractère saisi en comptant de 0
    		final int position = EqArea.getCaretPosition();
    		Point location;
            try {
                location = EqArea.modelToView(position).getLocation();
                System.out.print("Location : "+location+"\n");
            } catch (BadLocationException e2) {
                e2.printStackTrace();
                return;
            }
            String content = EqArea.getText();
            int start = Math.max(0, position - 1);
            System.out.print("   texte : "+content+"\n");
            System.out.print("   start : "+start+"\n");	    
     
            while (start > 0) {
                if (!Character.isWhitespace(content.charAt(start))) {
                    start--;
                } else {
                    start++;
                    break;
                }
            }
     
            if (start > position) {
                return;
            }
            final String prefix = content.substring(start, position);
            if (prefix.length() < 2) {
                return;
            }else{
            	for(int i=0; i<dictionary.size(); i++){
                	if(dictionary.get(i).contains(prefix)){;
                	words.add(dictionary.get(i));
                	}
            	}	
            }
            System.out.printf("\nSuggestion    : " + words);
            suggestion = new SuggestionPanel(EqArea, position, prefix, location);
    	}	
     
    	/**
            * Invoqué quand une touche du clavier est appuyée
            * @param arg0
            */
    	@Override
    	public void keyPressed(KeyEvent e) {
    		// TODO Auto-generated method stub
    		if (e.getKeyCode() == KeyEvent.VK_DOWN && suggestion != null) {
    			System.out.print("\nMOVE DOWN");
    			suggestion.getList().requestFocusInWindow();
    			suggestion.getList().setSelectedIndex(1);
    			suggestion.getList().addKeyListener(new KeyAdapter(){
                	public void keyPressed(KeyEvent ke){
                	    if(ke.getKeyCode() == KeyEvent.VK_DOWN){
                	    	System.out.print("\nMOVE DOWN, OH YEAH\n");
                	    	ke.consume();
                	    }
                	 }
                });
    //			suggestion.getList().requestFocus();
            }
    	}	
    	/**
            * Invoqué quand une touche du clavier est relachée
            * @param arg0
            */
    	@Override
    	public void keyReleased(KeyEvent e) {
    		// TODO Auto-generated method stub
    		if (Character.isLetterOrDigit(e.getKeyChar())) {
                findSuggestion();
    		}
    	}
    	@Override
    	public void keyTyped(KeyEvent arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
     
     
     
    }
    J'espère que vous pourrez m'aider car je désespère énormément


    ps : ci-joint le text area avec le pop up
    Images attachées Images attachées  

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 977
    Points
    7 977
    Par défaut
    Il manque pas mal de code pour pouvoir tester ton code, qui a l'air un peu confus. (Pas de main, etc ...)
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Il manque pas mal de code pour pouvoir tester ton code, qui a l'air un peu confus. (Pas de main, etc ...)
    En effet, je développe actuellement un outil qui calcul des expressions booléennes à partir des équations tapées par l'utilisateur. J'ai mis en place une architecture MVC, donc oui, mon projet contient beaucoup de classe... Là j'essaie juste d’implémenter une fonction de complétion.

    Ci-dessous tu trouvera le code du programme duquel je me suis très fortement inspiré. Le problème est le même dans celui-ci.

    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
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Point;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.JTextArea;
    import javax.swing.ListSelectionModel;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.text.BadLocationException;
     
    public class Test {
     
        public class SuggestionPanel {
            private JList list;
            private JPopupMenu popupMenu;
            private String subWord;
            private final int insertionPosition;
     
            public SuggestionPanel(JTextArea textarea, int position, String subWord, Point location) {
                this.insertionPosition = position;
                this.subWord = subWord;
                popupMenu = new JPopupMenu();
                popupMenu.removeAll();
                popupMenu.setOpaque(false);
                popupMenu.setBorder(null);
                popupMenu.add(list = createSuggestionList(position, subWord), BorderLayout.CENTER);
                popupMenu.show(textarea, location.x, textarea.getBaseline(0, 0) + location.y);
            }
     
            public void hide() {
                popupMenu.setVisible(false);
                if (suggestion == this) {
                    suggestion = null;
                }
            }
     
            private JList createSuggestionList(final int position, final String subWord) {
                Object[] data = new Object[10];
                for (int i = 0; i < data.length; i++) {
                    data[i] = subWord + i;
                }
                JList list = new JList(data);
                list.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
                list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                list.setSelectedIndex(0);
                list.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        if (e.getClickCount() == 2) {
                            insertSelection();
                        }
                    }
                });
                return list;
            }
     
            public boolean insertSelection() {
                if (list.getSelectedValue() != null) {
                    try {
                        final String selectedSuggestion = ((String) list.getSelectedValue()).substring(subWord.length());
                        textarea.getDocument().insertString(insertionPosition, selectedSuggestion, null);
                        return true;
                    } catch (BadLocationException e1) {
                        e1.printStackTrace();
                    }
                    hideSuggestion();
                }
                return false;
            }
     
            public void moveUp() {
                int index = Math.min(list.getSelectedIndex() - 1, 0);
                selectIndex(index);
            }
     
            public void moveDown() {
                int index = Math.min(list.getSelectedIndex() + 1, list.getModel().getSize() - 1);
                selectIndex(index);
            }
     
            private void selectIndex(int index) {
                final int position = textarea.getCaretPosition();
                list.setSelectedIndex(index);
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        textarea.setCaretPosition(position);
                    };
                });
            }
        }
     
        private SuggestionPanel suggestion;
        private JTextArea textarea;
     
        protected void showSuggestionLater() {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    showSuggestion();
                }
     
            });
        }
     
        protected void showSuggestion() {
            hideSuggestion();
            final int position = textarea.getCaretPosition();
            Point location;
            try {
                location = textarea.modelToView(position).getLocation();
                System.out.print("Location : "+location+"\n");
            } catch (BadLocationException e2) {
                e2.printStackTrace();
                return;
            }
            String text = textarea.getText();
            System.out.print("   texte : "+text+"\n");
            int start = Math.max(0, position - 1);
            System.out.print("   start : "+start+"\n");
     
     
            while (start > 0) {
                if (!Character.isWhitespace(text.charAt(start))) {
                    start--;
                } else {
                    start++;
                    break;
                }
            }
            if (start > position) {
                return;
            }
            final String subWord = text.substring(start, position);
            if (subWord.length() < 2) {
                return;
            }
            suggestion = new SuggestionPanel(textarea, position, subWord, location);
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                   // textarea.requestFocusInWindow();
                }
            });
        }
     
        private void hideSuggestion() {
            if (suggestion != null) {
                suggestion.hide();
            }
        }
     
        protected void initUI() {
            final JFrame frame = new JFrame();
            frame.setTitle("Test frame on two screens");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel panel = new JPanel(new BorderLayout());
            textarea = new JTextArea(24, 80);
            textarea.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
            textarea.addKeyListener(new KeyListener() {
     
                @Override
                public void keyTyped(KeyEvent e) {
                    if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                        if (suggestion != null) {
                            if (suggestion.insertSelection()) {
                                e.consume();
                                final int position = textarea.getCaretPosition();
                                SwingUtilities.invokeLater(new Runnable() {
                                    @Override
                                    public void run() {
                                        try {
                                            textarea.getDocument().remove(position - 1, 1);
                                        } catch (BadLocationException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                });
                            }
                        }
                    }
                }
     
                @Override
                public void keyReleased(KeyEvent e) {
                    if (e.getKeyCode() == KeyEvent.VK_DOWN && suggestion != null) {
                        suggestion.moveDown();
                    } else if (e.getKeyCode() == KeyEvent.VK_UP && suggestion != null) {
                        suggestion.moveUp();
                    } else if (Character.isLetterOrDigit(e.getKeyChar())) {
                        showSuggestionLater();
                    } else if (Character.isWhitespace(e.getKeyChar())) {
                        hideSuggestion();
                    }
                }
     
                @Override
                public void keyPressed(KeyEvent e) {
     
                }
            });
            panel.add(textarea, BorderLayout.CENTER);
            frame.add(panel);
            frame.pack();
            frame.setVisible(true);
        }
     
        public static void main(String[] args) {
        	//ameliore l'interface 
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (UnsupportedLookAndFeelException e) {
                e.printStackTrace();
            }
            SwingUtilities.invokeLater(new Runnable() {
     
                @Override
                public void run() {
                    new Test().initUI();
                }
            });
        }
     
    }
    Merci d'avance

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 977
    Points
    7 977
    Par défaut
    Tu essayes de mettre une JList dans un popupmenu ce qui n'est pas impossible mais je trouve cela bizarre. (il faut alors demander l'objet JList demande le focus, mais ça va quand meme poser problème pour faire enter et valider etc...)

    Essaye un peu plutot de rajouter des JMenuItem pour tes elements du dictionnaire, tu devrais remarquer un changement. Évidemment il faudra modifier ton code dans certains endroits.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut
    Oui effectivement, je viens de regarder sur des tutos, JMENUITEM semble plus approprié.

    Petite question, étant donné que le nombre d'item et dynamique et dépend de la chaine de caractère que tape l'utilisateur, penses tu qu'il est pssible de créer une arrayList de JMENUITEM ?

    merci

  8. #8
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 977
    Points
    7 977
    Par défaut
    Ou sinon, essaye ceci, mais cela n'est pas parfait (genre si on appuye sur enter qd la liste apparait, elle ne disparait pas, il y' a qlq chose qui ne fonctionne pas bien dans ton code, tu ne cible pas les bon composants a certains endroits).

    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
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    package pckg.view;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Point;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.JTextArea;
    import javax.swing.ListSelectionModel;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.text.BadLocationException;
     
    public class Test {
     
        public class SuggestionPanel {
            private JList list;
            private final JPopupMenu popupMenu;
            private final String subWord;
            private final int insertionPosition;
     
            public SuggestionPanel(JTextArea textarea, int position, String subWord, Point location) {
                this.insertionPosition = position;
                this.subWord = subWord;
                popupMenu = new JPopupMenu();
                popupMenu.removeAll();
                popupMenu.setOpaque(false);
                popupMenu.setBorder(null);
                popupMenu.add(list = createSuggestionList(position, subWord), BorderLayout.CENTER);
                popupMenu.show(textarea, location.x, textarea.getBaseline(0, 0) + location.y);
     
                // Request le focus sur la liste.
                list.requestFocus();
     
            }
     
            public void hide() {
                popupMenu.setVisible(false);
                if (suggestion == this) {
                    suggestion = null;
                }
            }
     
            private JList createSuggestionList(final int position, final String subWord) {
                Object[] data = new Object[10];
                for (int i = 0; i < data.length; i++) {
                    data[i] = subWord + i;
                }
                JList list = new JList(data);
                list.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
                list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                list.setSelectedIndex(0);
                list.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        if (e.getClickCount() == 2) {
                        	insertSelection();
                        }
                    }
                });
     
                // UN LISTENER pour quand on appuye sur Enter dans la liste.
                list.addKeyListener(new KeyListener() {
     
    				@Override
    				public void keyTyped(KeyEvent e)
    				{
    					// TODO Auto-generated method stub
     
    				}
     
    				@Override
    				public void keyPressed(KeyEvent e)
    				{
    					// TODO Auto-generated method stub
     
    				}
     
    				@Override
    				public void keyReleased(KeyEvent e)
    				{
    					if (e.getKeyCode() == KeyEvent.VK_ENTER)
    						insertSelection();
    				}
     
                });
     
                return list;
            }
     
            public boolean insertSelection() {
                if (list.getSelectedValue() != null) {
                    try {
                        final String selectedSuggestion = ((String) list.getSelectedValue()).substring(subWord.length());
                        textarea.getDocument().insertString(insertionPosition, selectedSuggestion, null);
                        return true;
                    } catch (BadLocationException e1) {
                        e1.printStackTrace();
                    }
                    hideSuggestion();
                }
                return false;
            }
     
            public void moveUp() {
                int index = Math.min(list.getSelectedIndex() - 1, 0);
                selectIndex(index);
            }
     
            public void moveDown() {
                int index = Math.min(list.getSelectedIndex() + 1, list.getModel().getSize() - 1);
                selectIndex(index);
            }
     
            private void selectIndex(int index) {
                final int position = textarea.getCaretPosition();
                list.setSelectedIndex(index);
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        textarea.setCaretPosition(position);
                    };
                });
            }
        }
     
        private SuggestionPanel suggestion;
        private JTextArea textarea;
     
        protected void showSuggestionLater() {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    showSuggestion();
                }
     
            });
        }
     
        protected void showSuggestion() {
            hideSuggestion();
            final int position = textarea.getCaretPosition();
            Point location;
            try {
                location = textarea.modelToView(position).getLocation();
                System.out.print("Location : "+location+"\n");
            } catch (BadLocationException e2) {
                e2.printStackTrace();
                return;
            }
            String text = textarea.getText();
            System.out.print("   texte : "+text+"\n");
            int start = Math.max(0, position - 1);
            System.out.print("   start : "+start+"\n");
     
     
            while (start > 0) {
                if (!Character.isWhitespace(text.charAt(start))) {
                    start--;
                } else {
                    start++;
                    break;
                }
            }
            if (start > position) {
                return;
            }
            final String subWord = text.substring(start, position);
            if (subWord.length() < 2) {
                return;
            }
            suggestion = new SuggestionPanel(textarea, position, subWord, location);
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                   // textarea.requestFocusInWindow();
                }
            });
        }
     
        private void hideSuggestion() {
            if (suggestion != null) {
                suggestion.hide();
            }
        }
     
        protected void initUI() {
            final JFrame frame = new JFrame();
            frame.setTitle("Test frame on two screens");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel panel = new JPanel(new BorderLayout());
            textarea = new JTextArea(24, 80);
            textarea.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
            textarea.addKeyListener(new KeyListener() {
     
                @Override
                public void keyTyped(KeyEvent e) {
                    if (e.getKeyChar() == KeyEvent.VK_ENTER) {
                        if (suggestion != null) {
                            if (suggestion.insertSelection()) {
                                e.consume();
                                final int position = textarea.getCaretPosition();
                                SwingUtilities.invokeLater(new Runnable() {
                                    @Override
                                    public void run() {
                                        try {
                                            textarea.getDocument().remove(position - 1, 1);
                                        } catch (BadLocationException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                });
                            }
                        }
                    }
                }
     
                @Override
                public void keyReleased(KeyEvent e) {
                    if (e.getKeyCode() == KeyEvent.VK_DOWN && suggestion != null) {
                        suggestion.moveDown();
                    } else if (e.getKeyCode() == KeyEvent.VK_UP && suggestion != null) {
                        suggestion.moveUp();
                    } else if (Character.isLetterOrDigit(e.getKeyChar())) {
                        showSuggestionLater();
                    } else if (Character.isWhitespace(e.getKeyChar())) {
                        hideSuggestion();
                    }
                }
     
                @Override
                public void keyPressed(KeyEvent e) {
     
                }
            });
            panel.add(textarea, BorderLayout.CENTER);
            frame.add(panel);
            frame.pack();
            frame.setVisible(true);
        }
     
        public static void main(String[] args) {
        	//ameliore l'interface 
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (UnsupportedLookAndFeelException e) {
                e.printStackTrace();
            }
            SwingUtilities.invokeLater(new Runnable() {
     
                @Override
                public void run() {
                    new Test().initUI();
                }
            });
        }
     
    }
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut
    Je viens d'essayer ton code et cela marche BIEN. En appelant la methode hide() quand on appui sur ENTER, alors le pannel disparaît.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    				public void keyReleased(KeyEvent e)
    				{
    					if (e.getKeyCode() == KeyEvent.VK_ENTER){
    						insertSelection();
    						hide();
    					}
    				}
     
                });
    Merci beaucoup... Par contre ne je comprend pas pourquoi tu dis que je ne cible pas les bon composants a certains endroits ??

  10. #10
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 977
    Points
    7 977
    Par défaut
    Lorsque tu faisait par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    popupMenu.requestFocusInWindow();
    en fait ce que je pense que tu voulais était :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list.requestFocusInWindow();
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut
    Oui en effet, c'est ça!

    Enfin, maintenant que le problème est plus ou moins résolu. Devrais-je, selon toi, modifier le code afin d'utiliser des JMenuItem plutot que JLIST ou bien cela importe peu ?

  12. #12
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 977
    Points
    7 977
    Par défaut
    Citation Envoyé par Miigui Voir le message
    Oui en effet, c'est ça!

    Enfin, maintenant que le problème est plus ou moins résolu. Devrais-je, selon toi, modifier le code afin d'utiliser des JMenuItem plutot que JLIST ou bien cela importe peu ?
    Pas forcement au fond, je ne sais pas quel avantage tu aurais au final ou pas.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide problème clavier Cyborg Hawk
    Par Pandor4s dans le forum Linux
    Réponses: 1
    Dernier message: 14/07/2015, 22h36
  2. [XL-2013] Naviguer dans un userform à l'aide du clavier
    Par Maair dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 30/03/2015, 16h48
  3. aide touche clavier
    Par makroute dans le forum C++Builder
    Réponses: 4
    Dernier message: 27/05/2008, 16h13
  4. [JList] Monter et descendre avec le clavier
    Par debdev dans le forum Composants
    Réponses: 16
    Dernier message: 09/04/2005, 17h45
  5. [JList] Sélection au clavier
    Par debdev dans le forum Composants
    Réponses: 2
    Dernier message: 11/03/2005, 17h41

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