java cambia el documento en DocumentListener

Uso un DocumentListener para manejar cualquier cambio en un documento JTextPane . mientras que los tipos de usuario quiero eliminar los contenidos de JTextPane e insertar un texto personalizado en su lugar. no es posible cambiar el documento en el DocumentListener , en su lugar se dice una solución aquí: java.lang.IllegalStateException mientras uso Document Listener en TextArea, Java , pero no entiendo eso, al menos no sé qué hacer en mi caso?

DocumentListener solo sirve para la notificación de cambios y nunca debe usarse para modificar un campo o documento de texto.

En su lugar, use un DocumentFilter

Mira aquí ejemplos

FYI

El curso raíz de su problema es que el DocumentListener se notifica MIENTRAS el documento se ha actualizado. Los bashs de modificar el documento (además de arriesgar un bucle infinito) ponen el documento en un estado inválido, de ahí la excepción

Actualizado con un ejemplo

Este es un ejemplo MUY básico … No maneja insertar o eliminar, pero mi prueba ha eliminado el trabajo 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); } } } } } 

mientras que los tipos de usuario quiero eliminar los contenidos de JTextPane e insertar un texto personalizado en su lugar.

  • esto no es trabajo para DocumentListener , básicamente este Listener está diseñado para disparar eventos desde JTextComponent hacia el otro JComponent, hacia Swing GUI, métodos implementados en Java usado

  • tenga en cuenta DocumentFilter , este proporciona los métodos deseados para cambiar, modificar o actualizar su propio documento (modelo para JTextComponents ) en tiempo de ejecución

Envuelva el código que llama en SwingUtilities.invokeLater()

    Intereting Posts