java - JTextArea - 仅在文档​​末尾启用编辑

标签 java swing mouseevent jtextarea

我使用 JTextArea,通过双击我可以在任何地方选择单词,但我不想启用编辑。这意味着文本只能在文本区域的末尾输入,不能在中间的任何位置输入。

我试过像下面这样的鼠标监听器:

@Override
public void mouseClicked(MouseEvent me) {
       if(SwingUtilities.isLeftMouseButton(me)){
        System.err.println("clicked");
        int pos = textArea.getCaretPosition();
        if(pos < textArea.getDocument().getLength()){
            textArea.setCaretPosition(textArea.getDocument().getLength());
        }
    }
   }

这使得双击不选择单词。我了解这是因为插入符号位置已移至末尾。但我怎样才能做到这一点?

最佳答案

查看 Protected Text Component这使您可以保护文档的多个区域免受更改。

或者如果您不需要能够“选择”任何 protected 文本,那么更简单的解决方案是使用 NavigationFilter:

import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class NavigationFilterPrefixWithBackspace extends NavigationFilter
{
    private int prefixLength;
    private Action deletePrevious;

    public NavigationFilterPrefixWithBackspace(int prefixLength, JTextComponent component)
    {
        this.prefixLength = prefixLength;
        deletePrevious = component.getActionMap().get("delete-previous");
        component.getActionMap().put("delete-previous", new BackspaceAction());
        component.setCaretPosition(prefixLength);
    }

    @Override
    public void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias)
    {
        fb.setDot(Math.max(dot, prefixLength), bias);
    }

    @Override
    public void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias)
    {
        fb.moveDot(Math.max(dot, prefixLength), bias);
    }

    class BackspaceAction extends AbstractAction
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            JTextComponent component = (JTextComponent)e.getSource();

            if (component.getCaretPosition() > prefixLength)
            {
                deletePrevious.actionPerformed( null );
            }
        }
    }

    private static void createAndShowUI()
    {
        JTextField textField = new JTextField("Prefix_", 20);
        textField.setNavigationFilter( new NavigationFilterPrefixWithBackspace(7, textField) );

        JFrame frame = new JFrame("Navigation Filter Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(textField);
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

关于java - JTextArea - 仅在文档​​末尾启用编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22928666/

相关文章:

java - 相机没有返回我拍摄的图像

Java 2D,在 X 和 Y 轴上具有相同数量的翻译会导致不同的结果

java - 将 List<Class> 中的值添加到 Jtable

c# - 在 MouseDown 上显示 MessageBox 占用了 MouseUp 事件

javascript - 使用 EaselJS 获取触摸设备上的 "mouse"位置

java - 无法从 Java servlet 访问 Tomcat 服务器

java - java中的Matlab函数imresize

ios - 通过cycript在越狱设备上模拟鼠标点击事件

java - 使用属性子集确定唯一性的不同对象列表

java - JTable 中的列不更新