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
Antwort
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();
}
});
*/
}
}
Danke für die Hilfe, es hat funktioniert. –
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();
Vielleicht hilft http://stackoverflow.com/questions/22624869/how-to-highlight-all-the- text-in-jtextpane – RubioRic