JTextField's и PlainDocument - как напечатать строку в событии удаления?

Я создал JTextField и установил свойство setDocument с расширенным классом из PlainDocument.

Когда я стираю из текстового поля, я хочу напечатать оставшуюся строку, но она печатается всего за один шаг до этого.

скажем. Если JTextField имеет строку вроде 123456789, и я стираю один символ с помощью возврата, тогда он печатает нормально (12345678). Но если я удалю, скажем, «3», тогда появится «1234567». Итак, я печатаю предыдущее значение. Если я затем удалю еще один символ, он покажет, что 3 был стерт. . только то, что он знает, что длина изменилась, и печатает на один символ меньше сзади.

Если я не ясно выразился. Я хочу напечатать «настоящую» строку, которую имеет текстовое поле при удалении из кода простого документа.

Когда я удаляю, он запускает метод удаления или удаления обновления, когда мой текст печатается. (вероятно, я печатаю на шаг раньше)

PS: мне нужно получить значение из простого документа, а не из поля jtext снаружи.

это мой код

protected void removeUpdate(AbstractDocument.DefaultDocumentEvent evento)
 {                      
        try {               
            super.removeUpdate(evento);
            removePostUpdate(evento);

        } catch (BadLocationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

 }

protected void removePostUpdate(AbstractDocument.DefaultDocumentEvent evento) throws BadLocationException
 {       
     try {              
            palabraCompleta = evento.getDocument().getDefaultRootElement().getDocument().getText(0,evento.getDocument().getDefaultRootElement().getDocument().getLength()-1 );                              
            System.out.println(evento.getPresentationName());               
        } catch (BadLocationException e) {          
            e.printStackTrace();
        }
        System.out.println(palabraCompleta);
 }

person HoNgOuRu    schedule 07.05.2012    source источник
comment
Этот код не может быть скомпилирован. Это должно быть подклассом JTextField? Кроме того, в removePostUpdate palabraCompleta не определена.   -  person ControlAltDel    schedule 07.05.2012
comment
Я просто вставляю важные части... String palabraCompleta; — общедоступная переменная класса, расширяющего обычный документ. Я вставил только два метода, которые срабатывают при удалении.   -  person HoNgOuRu    schedule 07.05.2012


Ответы (1)


Я воспроизвел то, что вы сделали с JTextField, используя документ по умолчанию.

Прежде всего, в вашем коде есть ошибка - вы используете длину - 1 вместо длины. Также не уверен, что вам нужен Document.getDefaultRootElement().getDocument(), который мне кажется неправильным.

Во всяком случае, тестовый код, который я создал ниже, работает без проблем. Учитывая ошибки, которые я обнаружил в опубликованном вами коде, я бы сказал, что ЕСЛИ действительно есть проблема, связанная с чем-то, что вы настроили, но не опубликовали здесь.


    public static void testDocument () {
        final JTextField tf = new JTextField();
        tf.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void changedUpdate(DocumentEvent arg0) {
                System.out.println(tf.getText());
                try {
                    System.out.println("printing: " + arg0.getDocument().getDefaultRootElement().getDocument().getText(0,arg0.getDocument().getDefaultRootElement().getDocument().getLength()));
                } catch (BadLocationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            @Override
            public void insertUpdate(DocumentEvent arg0) {
                System.out.println(tf.getText());               
                try {
                    System.out.println("printing: " + arg0.getDocument().getDefaultRootElement().getDocument().getText(0,arg0.getDocument().getDefaultRootElement().getDocument().getLength()));
                } catch (BadLocationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            @Override
            public void removeUpdate(DocumentEvent arg0) {
                System.out.println(tf.getText());               
                try {
                    System.out.println("doc: " + arg0.getDocument().getDefaultRootElement().getDocument().getText(0,arg0.getDocument().getDefaultRootElement().getDocument().getLength()));
                } catch (BadLocationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        });
        WindowUtilities.visualize(tf);
    }
person ControlAltDel    schedule 07.05.2012