Pregunta

Uso un DocumentListener para manejar cualquier cambio en un JTextPane documento. Mientras que los tipos de usuarios quiero eliminar los contenidos de JTextPane e inserte un texto personalizado en su lugar. No es posible cambiar el documento en el DocumentListener, en cambio, se dice una solución aquí:Java.Lang.illegalStateException Mientras usa el oyente de documentos en Textarea, Java, pero no entiendo eso, al menos no sé qué hacer en mi caso?

¿Fue útil?

Solución

DocumentListener Es realmente bueno para la notificación de cambios y nunca debe usarse para modificar un campo / documento de texto.

En su lugar, usa un DocumentFilter

Controlar aquí por ejemplo

Fyi

El curso raíz de tu problema es que el DocumentListener Se notifica mientras se actualiza el documento. Intentos de modificar el documento (aparte de arriesgarse a un bucle infinito) poner el documento en un estado inválido, de ahí la excepción

Actualizado con un ejemplo

Este es un ejemplo muy básico ... no se encarga de insertar o eliminar, pero mis pruebas habían eliminado trabajando sin hacer nada de todos modos ...

enter image description here

public class TestHighlight {

    public static void main(String[] args) {
        new TestHighlight();
    }

    public TestHighlight() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JTextPane textPane = new JTextPane(new DefaultStyledDocument());
                ((AbstractDocument) textPane.getDocument()).setDocumentFilter(new HighlightDocumentFilter(textPane));
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(textPane));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class HighlightDocumentFilter extends DocumentFilter {

        private DefaultHighlightPainter highlightPainter = new DefaultHighlightPainter(Color.YELLOW);
        private JTextPane textPane;
        private SimpleAttributeSet background;

        public HighlightDocumentFilter(JTextPane textPane) {
            this.textPane = textPane;
            background = new SimpleAttributeSet();
            StyleConstants.setBackground(background, Color.RED);
        }

        @Override
        public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
            System.out.println("insert");
            super.insertString(fb, offset, text, attr);
        }

        @Override
        public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
            System.out.println("remove");
            super.remove(fb, offset, length);
        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {

            String match = "test";

            super.replace(fb, offset, length, text, attrs);

            int startIndex = offset - match.length();
            if (startIndex >= 0) {

                String last = fb.getDocument().getText(startIndex, match.length()).trim();
                System.out.println(last);
                if (last.equalsIgnoreCase(match)) {

                    textPane.getHighlighter().addHighlight(startIndex, startIndex + match.length(), highlightPainter);

                }

            }
        }

    }

}

Otros consejos

Si bien los tipos de usuarios quiero eliminar los contenidos de JTextPane e insertar un texto personalizado en su lugar.

Envolver el código en el que llamas SwingUtilities.invokeLater()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top