Frage

Ich benutze ein DocumentListener um jede Änderung in einem zu handhaben JTextPane dokumentieren. Während die Benutzertypen ich den Inhalt von löschen möchte JTextPane und geben Sie stattdessen einen benutzerdefinierten Text ein. Es ist nicht möglich, das Dokument in der DocumentListener, stattdessen wird hier eine Lösung gesagt:java.lang.illegalstateException bei der Verwendung von Dokumentlistener in Textarea, Java, aber ich verstehe das nicht, zumindest weiß ich nicht, was ich in meinem Fall tun soll?

War es hilfreich?

Lösung

DocumentListener ist wirklich nur gut für die Benachrichtigung von Änderungen und sollte niemals verwendet werden, um ein Textfeld / Dokument zu ändern.

Verwenden Sie stattdessen a DocumentFilter

Überprüfen Hier zum Beispiel

Fyi

Der Wurzelkurs Ihres Problems ist, dass das DocumentListener wird benachrichtigt, während das Dokument aktualisiert wurde. Versuche, das Dokument zu ändern (abgesehen von der Riskierung einer Infinite-Schleife) legen das Dokument in einen ungültigen Status, somit die Ausnahme

Mit einem Beispiel aktualisiert

Dies ist ein sehr grundlegendes Beispiel ... es ist nicht mit der Einfügung oder Entfernung, aber meine Tests hatten die Arbeit, ohne irgendetwas etwas zu tun ...

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

                }

            }
        }

    }

}

Andere Tipps

Während die Benutzertypen ich den Inhalt von JTextPane löschen und stattdessen einen benutzerdefinierten Text einfügen.

Wickeln Sie den Code, der Sie anrufen SwingUtilities.invokeLater()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top