2016-04-08 20 views
2

ausgewählt werden Ich habe einen Text wie "test_1_another_2_test3" in meinem JTextPane. Wenn ich auf den Text doppelklicke, wird nicht der gesamte Text ausgewählt (manchmal wird nur ein Zeichen oder eine Zahl oder der Text zwischen Unterstrichen ausgewählt). Ich kann einen mouseactionlistener implementieren, habe aber keine Idee, wie ich die Aktion implementieren soll."Text mit Nummer und Unterstrich" auf DoubleClick kann nicht in JTextPane

+1

Vielleicht hilft http://stackoverflow.com/questions/22624869/how-to-highlight-all-the- text-in-jtextpane – RubioRic

Antwort

1

ich eine mouseactionlistener implementieren kann

Sie sollten keinen MouseListener implementieren.

Swing funktioniert mit Aktionen. Die DefaultEditorKit bietet die Standardeinstellung Action, die den Text mit einem Doppelklick auswählt.

Siehe Key Bindings. Diese Klasse zeigt an, welche Actions standardmäßig auf KeyStroke abgebildet sind. Außerdem werden alle Standardaktionen für eine Komponente angezeigt.

Also im Grunde müssen Sie den Standard Action ersetzen. Die Standardaktion heißt DefaultWordActon. Diese Aktion wiederum ruft StartWordAction und EndWordAction auf. Es scheint, dass diese beiden Aktionen die Suche beenden, wenn sie einen Unterstrich mit einem numerischen Wert finden. Im Grunde müssen Sie dieses Verhalten ändern, um die Suche fortzusetzen.

Der folgende Code fügt eine Schleife Suche zu halten, wenn ein Unterstrich gefunden wird:

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

Danke für die Hilfe, es hat funktioniert. –

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

Markiert den gesamten Text im JTextPane, aber es tut sich nichts auf einem null oder empty Dokument.

Diese Methode wird von JTextComponent Klasse geerbt, der eine super Klasse von JTextPane

ist, wie diese Methode verwenden ..

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