2

我的 JTextPane 中有一个类似“test_1_another_2_test3”的文本。当我双击文本时,它不会选择整个文本(有时,它只选择一个字符或数字或下划线之间的文本)。我可以实现 mouseactionlistener,但不知道如何实现动作。

4

2 回答 2

2

我可以实现一个mouseactionlistener

您不应该实现 MouseListener。

Swing 通过使用动作来工作。提供在双击时选择文本的DefaultEditorKit默认设置。Action

请参阅键绑定。此类将显示默认情况下Actions映射到的KeyStroke。它还将显示组件的所有默认操作。

所以基本上你需要替换默认的Action. 默认的 Action 被调用DefaultWordActon。此 Action 依次调用StartWordActionEndWordAction。这两个动作似乎在找到带有数值的下划线时停止搜索。所以基本上你需要修改这个行为来继续搜索。

以下代码添加了一个循环以在找到下划线时继续搜索:

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();
            }
        });
*/
    }
}
于 2016-04-08T16:40:05.100 回答
0
public void selectAll() //method to select all Elements.

选择 中的所有文本JTextPane,但对文档nullempty文档不执行任何操作。

这个方法是继承自JTextComponentClass,它是一个superJTextPane

如何使用此方法..

JTextPane obj_jTextPane = new JTextPane();
obj_jTextPane .selectAll();
于 2016-04-08T06:29:36.130 回答