JTextField DocumentListener / DocumentEvent - PullRequest
0 голосов
/ 18 февраля 2010

Я хотел бы знать, как использовать DocumentListener / DocumentEvent в Java, чтобы предотвратить удаление пользователем определенной части текста в JTextField, как в командной строке Windows или Unix Terminal. они показывают текущий рабочий каталог, и вы не можете удалить после> или $

Кто-нибудь может мне помочь? спасибо

1 Ответ

3 голосов
/ 18 февраля 2010

Проблема с использованием добавления на DocumentListener заключается в том, что вы не можете вернуть назад часть, которая была удалена или отредактирована из слушателя, иначе вы получите исключение, говорящее о том, что вы пытаетесьизменить содержимое, когда у вас есть уведомление.Самый простой способ, который я знаю, это создать подкласс Document , переопределить remove в Document и настроить текстовое поле для использования документа, как в моем примере ниже:

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);    
            }
        }
    }
}
...