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

Composants Java Discussion :

[JTextField] Modifier PasteAction


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut [JTextField] Modifier PasteAction
    Bonjour,

    J'ai une interface graphique avec un tableau de JTextField que l'utilisateur doit remplir. Il peut soit se les farcir à la main (toujours très agréable ), soit clicker sur un JButton Collage qui importe alors les données depuis le presse-papier (déjà mieux ). Le problème est que lorsque l'utilisateur utilise le clavier (Ctrl V) pour remplir l'interface graphique, le toolkit colle toutes les données dans la première case et laisse les autres vides . Je voudrais donc savoir s'il y a un moyen de modifier le comportement de Ctrl V pour que cette commande effectue la même action que le JButton Collage.

    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Bonjour,

    Je ne suis pas sur que cela soit très ergonomique pour l'utilisateur de détourner Ctrl-V de son utilisation "intuitive" sous Windows.

    Quoi qu'il en soit, voici un exemple où Ctrl-V au sein du JTextField est remplacé par une autre action que le "coller" de Windows. En l'occurrence, un message est affiché sur la sortie standard montrant que le Ctrl-V a été intercepté, et affichant le contenu texte du presse-papier. On peut évidemment remplacer cet affichage par une autre action.

    Cordialement,

    Nicolas

    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
    package testctrlv;
     
    import java.awt.Toolkit;
    import java.awt.datatransfer.*;
    import java.awt.event.*;
    import java.io.IOException;
    import javax.swing.*;
     
    // par Nicolas_75
    // le 24 août 2008
    // pour http://www.developpez.net/forums/d603916/java/interfaces-graphiques-java/awt-swing/listeners/jtextfield-modifier-pasteaction/
    // tutorial SUN : http://java.sun.com/docs/books/tutorial/uiswing/misc/keybinding.html
     
    public class TestCtrlV {
     
        public static void main(String[] args) {
            JFrame frame = new JFrame("Test Ctrl-V");
            // création du champ texte :
            JTextField textField = new JTextField("coucou");
            // liaison du Ctrl-V sur le champ texte avec l'action "my Action" :
            textField.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK),
                    "myAction");
            // définition de l'action "myAction" :
            textField.getActionMap().put("myAction", new AbstractAction() {
                public void actionPerformed(ActionEvent e) {
                    // récupération du contenu du presse-papier :
                    // (code venant de http://java.developpez.com/faq/java/?page=systeme#SYSTEME_pressePapier)
                    Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
                    String txt = "";
                    try {
                        if( t!=null && t.isDataFlavorSupported(DataFlavor.stringFlavor) ) {
                            txt = (String) t.getTransferData(DataFlavor.stringFlavor);
                        }
                    } catch( UnsupportedFlavorException e1) {
                        e1. printStackTrace();
                    } catch( IOException e2 ) {
                        e2.printStackTrace();
                    }
                    // affichage sur la sortie standard :
                    System.out.println("Ctrl-v pressed - clipboard contains \""+txt+"\"");
                }
            } );
            frame.add(textField);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Par défaut
    Bonjour Nicolas_75,

    Grand merci pour ta réponse : après adaptation à mon code, ça marche impeccable. Je replace ici le problème et la solution. On a une JFrame Coordonnees qui contient un Jpanel() point, qui contient un JTextField[][] Tpoint :

    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
    public class Coordonnees extends JFrame implements ActionListener {
     
        private int Ngrands;
        private int Npoints;
     
        protected Coordonnees(int Ngrands,int Npoints) {
            super("Coordonnees");
            this.Ngrands = Ngrands;
            this.Npoints = Npoints;
            JPanel point = new JPanel();
            JTextField[][] Tpoint = new JTextField[this.Ngrands][this.Npoints];
            point.add(Tpoint);
       }
     
    }
    Le problème est alors que si on copie un tableau depuis un fichier et qu'on appuie sur "Ctrl-V", toutes les données seront collées dans la première case de Tpoint et rien dans les autres. Or il faudrait que le tableau soit recopié à l'identique. La solution est :

    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
    public class Coordonnees extends JFrame implements ActionListener {
     
        private int Ngrands;
        private int Npoints;
        private static JTextField[][] Tpoint;
     
        protected Coordonnees(int Ngrands,int Ncoeffs) {
            super("Coordonnees");
            this.Ngrands = Ngrands;
            this.Npoints = Npoints;
            JPanel point = new JPanel();
            Tpoint = new JTextField[this.Ngrands][this.Npoints];
            point.add(Tpoint);
            final int NPoints = Npoints;
            final int NGrands = Ngrands;
            point.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK),"Coller");
            point.getActionMap().put("Coller", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
                    if ((contents != null) && contents.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                        try {
                            Scanner sc = new Scanner((String) contents.getTransferData(DataFlavor.stringFlavor));
                            for (int i=0;i<NPoints;i++) {
                                for (int j=0;j<NGrands;j++) {
                                    Tpoint[j][i].replaceSelection(sc.nextBigDecimal().toString());
                                }
                            }
                            sc.close();
                        }
                        catch (Throwable f) {
                            new Erreur(2);
                        }
                    }
                }
            });
        }
     
    }
    Encore merci, ça faisait un moment que je cherchais.

    chrisRg2r

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Si cela a pu t'aider, j'en suis ravi. Je t'en prie.

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

Discussions similaires

  1. Modifier la taille d'un JTextField
    Par ziad.shady dans le forum Composants
    Réponses: 1
    Dernier message: 15/05/2009, 10h04
  2. Réponses: 8
    Dernier message: 21/12/2006, 18h41
  3. [JTextField] Modifier l'aspect d'un JTextField
    Par tomburn dans le forum Composants
    Réponses: 2
    Dernier message: 25/07/2005, 16h02
  4. [VB6] [MDI] Modifier form en MDIform
    Par fikou dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 12/09/2002, 13h48
  5. Réponses: 5
    Dernier message: 06/08/2002, 20h08

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