JTextField DocumentListener/DocumentEvent

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

Может кто-нибудь помочь мне? Благодарность


person Community    schedule 18.02.2010    source источник
comment
Просто интересно узнать, зачем вам это нужно? Разве у вас нет JLabel и JTextField рядом с ним? Скажите что-нибудь вроде Имя: ______   -  person sateesh    schedule 18.02.2010
comment
Поскольку мне любопытно, и я хотел бы знать, как это сделать из JTextField, если бы я хотел сделать это, я бы не задавал здесь вопросы. Однако, спасибо.   -  person    schedule 18.02.2010


Ответы (1)


Проблема с использованием добавления в 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);    
            }
        }
    }
}
person Klarth    schedule 18.02.2010
comment
это работает именно так, как я хотел, спасибо за это :) - person ; 18.02.2010
comment
Как бы я изменил ПРЕФИКС, видя, как изменится текущий путь. - person ; 19.02.2010
comment
Вам нужно изменить его, чтобы пользовательский документ отслеживал содержание подсказки и ее длину. Я бы также добавил в пользовательский документ метод для изменения подсказки и получения содержимого после подсказки. Метод, устанавливающий подсказку, должен использовать методы в super для изменения подсказки, поскольку они были бы переопределены пользовательским документом. Я уже написал пример на box.net/shared/jjbzrz8fqe. - person Klarth; 19.02.2010