JTextField DocumentListener / DocumentEvent

时间:2010-02-18 07:44:51

标签: java swing document jtextfield

我想知道如何在java中使用DocumentListener / DocumentEvent来防止用户删除JTextField中的某些文本部分,比如在windows命令提示符或unix终端上。 它们显示当前的工作目录,你无法删除过去的>或$

谁能帮助我吗?感谢

1 个答案:

答案 0 :(得分:3)

DocumentListener 上使用添加的问题是,您无法修复从侦听器中删除或编辑的部分,否则您将获得一个例外,说明您正在尝试收到通知时修改内容。我知道最简单的方法是在文档上创建文档,覆盖删除并设置文本字段以使用文档,就像在我的文档中一样以下示例:

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;

public class Application {

    private static final String PREFIX = "Your Input>";

    private static final int prefixLength = PREFIX.length();

    /**
     * @param args
     */
    public static void main(String[] args) {
        JFrame rootFrame = new JFrame();
        JTextField textField = new JTextField(new PromptDocument(), PREFIX, 20);

        rootFrame.add(textField);
        rootFrame.pack();
        rootFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        rootFrame.setVisible(true);
    }

    private static class PromptDocument extends DefaultStyledDocument {

        private static final long serialVersionUID = 1L;

        @Override
        public void remove(int offs, int len) throws BadLocationException {
            if (offs > prefixLength - 1) {
                int buffer = offs - prefixLength;
                if (buffer < 0) {
                    len = buffer;
                }
                super.remove(offs, len);    
            }
        }
    }
}