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
Répondre
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();
}
});
*/
}
}
Merci pour l'aide, cela a fonctionné. –
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();
Peut-être que cette aide http://stackoverflow.com/questions/22624869/how-to-highlight-all-the- text-in-jtextpane – RubioRic