无法在 JTextPane 中对 DoubleClick select "text with number and underscore"
Unable to select "text with number and underscore" on DoubleClick in JTextPane
我的 JTextPane 中有类似 "test_1_another_2_test3" 的文本。当我双击文本时,它不会 select 整个文本(有时,它 select 只有一个字符或数字或下划线之间的文本)。我可以实现一个mouseactionlistener,但不知道如何实现这个动作。
public void selectAll() //method to select all Elements.
选择 JTextPane
中的所有文本,但对 null
或 empty
文档不执行任何操作。
该方法继承自JTextComponent
Class,是JTextPane
的super
class
How To use this Method..
JTextPane obj_jTextPane = new JTextPane();
obj_jTextPane .selectAll();
I can implement a mouseactionlistener
您不应该实现 MouseListener。
Swing 通过使用 Actions 工作。 DefaultEditorKit
提供默认值 Action
,双击时选择文本。
参见 Key Bindings。此 class 将显示哪些 Actions
默认映射到 KeyStroke
。它还将显示组件的所有默认操作。
所以基本上你需要替换默认的Action
。默认操作称为 DefaultWordActon
。此操作依次调用 StartWordAction
和 EndWordAction
。看起来这两个 Action 在找到带有数值的下划线时停止搜索。所以基本上你需要修改这个行为来继续搜索。
以下代码添加了一个循环,以便在找到下划线时继续搜索:
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();
}
});
*/
}
}
我的 JTextPane 中有类似 "test_1_another_2_test3" 的文本。当我双击文本时,它不会 select 整个文本(有时,它 select 只有一个字符或数字或下划线之间的文本)。我可以实现一个mouseactionlistener,但不知道如何实现这个动作。
public void selectAll() //method to select all Elements.
选择 JTextPane
中的所有文本,但对 null
或 empty
文档不执行任何操作。
该方法继承自JTextComponent
Class,是JTextPane
super
class
How To use this Method..
JTextPane obj_jTextPane = new JTextPane();
obj_jTextPane .selectAll();
I can implement a mouseactionlistener
您不应该实现 MouseListener。
Swing 通过使用 Actions 工作。 DefaultEditorKit
提供默认值 Action
,双击时选择文本。
参见 Key Bindings。此 class 将显示哪些 Actions
默认映射到 KeyStroke
。它还将显示组件的所有默认操作。
所以基本上你需要替换默认的Action
。默认操作称为 DefaultWordActon
。此操作依次调用 StartWordAction
和 EndWordAction
。看起来这两个 Action 在找到带有数值的下划线时停止搜索。所以基本上你需要修改这个行为来继续搜索。
以下代码添加了一个循环,以便在找到下划线时继续搜索:
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();
}
});
*/
}
}