2017-08-28 7 views
1

Mon application offre la possibilité de copier du texte d'un JTextArea à un JTextField (utilisé comme composant éditeur d'un JComboBox, mais je suppose que cela n'a pas d'importance) et je voudrais fournir pour supprimer les espaces de début et de fin si un booléen la condition est true (par exemple, une case à cocher est cochée). Entrer les espaces de début et de fin dans le JTextField devrait toujours être possible, seul le texte collé doit être manipulé comme décrit.Comment manipuler du texte collé dans un JTextField, mais pas saisi?

J'ai ajouté un DocumentFilter, mais il répond à la fois aux changements tapés et aux changements collés et je ne trouve aucune condition dans ses arguments de méthode qui permettent de distinguer les insertions typées des insertions collées. Un KeyListener ne répond pas aux modifications collées.

+0

Vous voulez donc faire la différence entre l'action de collage et l'action de type dans JTextField? – user3437460

Répondre

4

Je ne trouve aucune condition dans ses arguments de méthode qui permettent de distinguer les insertions typées des insertions collées. Un KeyListener ne répond pas aux modifications collées.

Le programme d'écoute ne fournit pas de moyen direct de déterminer si l'entrée provient d'une action de collage. Mais j'ai un simple travail autour de la solution qui peut fonctionner.

  1. Utilisez un DocumentListener pour détecter les changements de texte dans le JTextField. Si des modifications ont été détectées, passez à l'étape suivante.

  2. Prenez le texte Chaîne de l'objet Clipboard.

  3. Comparer le texte dans le JTextField et le texte du Clipboard. Si les chaînes sont les mêmes, nous supposons que le collage a eu lieu.


Dans le cas où l'utilisateur coller du texte dans entre le texte existant dans le champ de texte, vous pouvez obtenir la position de caret et comparer la chaîne à partir de la position de caret partir.


Mise à jour:

Pour lire Presse-papiers:

import java.awt.Toolkit; 
import java.awt.datatransfer.*; 

Clipboard cb=Toolkit.getDefaultToolkit().getSystemClipboard(); 
System.out.println(cb.getData(DataFlavor.stringFlavor)); 
0

J'ai ajouté un DocumentFilter, mais il répond à la fois typé changements et des changements et je collé ne trouvent pas toute condition dans sa méthode arguments permettant de distinguer les insertions typées des insertions collées

Je ne l'ai jamais essayé mais peut-être que vous pouvez utiliser la classe EventQueue. Plus précisément, vous pourriez être en mesure d'utiliser la méthode getCurrentEvent().

Je suppose que si le type d'événement est keyTyped alors il a été généré en tapant dans le champ texte.

D'autres événements seraient générés si le collage était fait en utilisant CTRL_V à partir du clavier ou si vous cliquez sur un élément de menu qui fait le collage.

Donc je suppose que vous avez juste besoin de vérifier si l'événement n'est pas un événement "KeyTyped" et d'invoquer votre logique de collage personnalisé.

+1

Cela ne devrait-il pas être un commentaire? Au moins jusqu'à ce que ça soit confirmé, ouais? –