2016-04-08 2 views
2

J'ai un texte comme "test_1_another_2_test3" dans mon JTextPane. Lorsque je double-clique sur le texte, il ne sélectionne pas le texte entier (parfois, il sélectionne seulement un caractère ou un nombre ou le texte entre les traits de soulignement). Je peux implémenter un mouseactionlistener, mais je n'ai aucune idée de comment implémenter l'action.Impossible de sélectionner "texte avec numéro et trait de soulignement" sur DoubleClick dans JTextPane

+1

Peut-être que cette aide http://stackoverflow.com/questions/22624869/how-to-highlight-all-the- text-in-jtextpane – RubioRic

Répondre

1

Je peux mettre en œuvre un mouseactionlistener

Vous ne devez pas implémenter MouseListener.

Swing fonctionne en utilisant Actions. Le DefaultEditorKit fournit la valeur par défaut Action qui sélectionne le texte en double-cliquant.

Voir Key Bindings. Cette classe montrera quels Actions sont mappés à un KeyStroke par défaut. Il affichera également toutes les actions par défaut pour un composant.

Donc, fondamentalement, vous devez remplacer le Action par défaut. L'action par défaut est appelée DefaultWordActon. Cette action appelle à son tour StartWordAction et EndWordAction. Il semble que ces deux actions cessent de chercher lorsqu'elles trouvent un trait de soulignement avec une valeur numérique. Donc, fondamentalement, vous devez modifier ce comportement pour continuer à chercher.

Le code suivant ajoute une boucle pour continuer à chercher quand un trait de soulignement se trouve:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class SelectWordAction extends TextAction 
{ 
    public SelectWordAction() 
    { 
     super("Select Word"); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     JTextComponent target = getTextComponent(e); 

     if (target != null) 
     { 
      int offset = target.getCaretPosition(); 
      beginWord(target, offset); 
      endWord(target, offset); 
     } 
    } 

    private void beginWord(JTextComponent target, int offset) 
    { 
     try 
     { 
      boolean keepSearching = true; 
      int beginOffset = Utilities.getWordStart(target, offset); 

      while (beginOffset > 1 && keepSearching) 
      { 
       String previousCharacter = target.getText(beginOffset - 1, 1); 

       if ("_".equals(previousCharacter)) 
        beginOffset = Utilities.getWordStart(target, beginOffset - 2); 
       else 
        keepSearching = false; 
      } 

      target.setCaretPosition(beginOffset); 
     } 
     catch (BadLocationException bl) 
     { 
      UIManager.getLookAndFeel().provideErrorFeedback(target); 
     } 
    } 

    private void endWord(JTextComponent target, int offset) 
    { 
     try 
     { 
      int length = target.getDocument().getLength() - 2; 
      boolean keepSearching = true; 
      int endOffset = Utilities.getWordEnd(target, offset); 

      while (endOffset < length && keepSearching) 
      { 
       String nextCharacter = target.getText(endOffset, 1); 

       if ("_".equals(nextCharacter)) 
        endOffset = Utilities.getWordEnd(target, endOffset + 1); 
       else 
        keepSearching = false; 
      } 

      target.moveCaretPosition(endOffset); 
     } 
     catch (BadLocationException bl) 
     { 
      UIManager.getLookAndFeel().provideErrorFeedback(target); 
     } 
    } 


    private static void createAndShowGUI() 
    { 
     JTextPane textPane = new JTextPane(); 

     Action action = new SelectWordAction(); 
     textPane.getActionMap().put("select-word", action); 

     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(textPane)); 
     frame.setLocationByPlatform(true); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 
+0

Merci pour l'aide, cela a fonctionné. –

0
public void selectAll() //method to select all Elements. 

Sélectionne tout le texte dans le JTextPane, mais il ne fait rien sur un document null ou empty.

Cette méthode est héritée de JTextComponent classe, ce qui est une classe super de JTextPane

Comment utiliser cette méthode ..

JTextPane obj_jTextPane = new JTextPane(); 
obj_jTextPane .selectAll();