Eingabe für TextArray bedingt sperren

kodela

Bekanntes Mitglied
Vorgehen und Ablauf zu meinem Problem:

Der Anwender gibt Wörter ein, die bestimmte Voraussetzungen erfüllen müssen. Ist eine dieser Voraussetzungen nicht erfüllt, wird er darauf hingewiesen und aufgefordert, das fehlerhafte Wort über die DEL-Taste zu entfernen. Ein einmaliges Drücken der DEL-Taste entfernt alle Eingaben bis zu letzten Leerstelle und der Anwender kann weitere Eingaben tätigen.

Nun sollte aber verhindert werden, dass der Anwender die Aufforderung ignoriert, vereinfacht gesagt, alle Tastendrücke, mit Ausnahme von DEL, sollten ignoriert werden. Wie kann dies erreicht werden?

Derzeit wird die Eingabe über 'keyTyped' behandelt. Damit wird auch die DEL-Taste abgefangen.
 
Lassen wir mal die Tastatur beiseite: es soll verhindert werden, dass am Dokument ungültige Änderungen vorgenommen werden. Das sollte sich mit einem DocumentFilter und ggf. einem InputVerifier regeln lassen. Hier mal ein Beispiel, das nur Löschvorgänge zulässt, wenn man "Sperren" aktiviert. In Kombination mit Deinem KeyListener könnte das schon zum gewünschten Ergebnis führen:

Java:
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.DocumentFilter;

public class Test {
    DocumentFilter deleteOnlyFilter = new DocumentFilter() {
        public void insertString(FilterBypass fb, int offset, String string, javax.swing.text.AttributeSet attr) throws javax.swing.text.BadLocationException {
            return;
        }
        public void replace(FilterBypass fb, int offset, int length, String text, javax.swing.text.AttributeSet attrs) throws javax.swing.text.BadLocationException {
            return;
        }
        public void remove(FilterBypass fb, int offset, int length) throws javax.swing.text.BadLocationException {
            fb.remove(offset, length);
        }
    };

    public void run() {
        JTextArea textArea = new JTextArea(5, 40);
        JToggleButton button = new JToggleButton("Sperren");
        button.addItemListener(e -> {
            DocumentFilter filter = e.getStateChange() == ItemEvent.SELECTED ? deleteOnlyFilter : null;
            ((AbstractDocument) textArea.getDocument()).setDocumentFilter(filter);
        });
      
        textArea.setText("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(button, BorderLayout.SOUTH);
        frame.add(textArea);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Danke!

Mit dem DocumentFilter müsste ich die Eingabe vorübergehend sperren können.

Wenn es klappt melde ich mich wieder, kann aber noch einige Tage dauern.
 

Zurück
Oben