DocumentListener soll Text in JTextField ändern

TheJavaKid

Top Contributor
Hallo,

bin gerade auf folgendes Problem gestoßen:

Ich bin dabei eine kleine Komponente zu schreiben, die ein Eingabefeld für IP Adressen darstellen soll

Ich prüfe mit dem DocumentListener ob die Eingabe der Zahl (es werden nur Zahlen zugelassen, bei der Eingabe) 255 nicht überschreitet.

Java:
columns[i].getDocument().addDocumentListener(new DocumentListener(){
                public void insertUpdate(DocumentEvent e) {
                    try {
                        if(Integer.parseInt(e.getDocument().getText(0, e.getDocument().getLength())) > 255) {
                            e.getDocument().remove(0, e.getDocument().getLength());
                            e.getDocument().insertString(0, "255", null);
                        }
                    } catch( BadLocationException ble ) { }
                }
                public void removeUpdate(DocumentEvent e) {
                }
                public void changedUpdate(DocumentEvent e) {
                }
            });

Dabei werfen die Zeilen
Java:
e.getDocument().remove(0, e.getDocument().getLength());
e.getDocument().insertString(0, "255", null);
eine Exception:

[WR]Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1338)
at javax.swing.text.AbstractDocument.remove(AbstractDocument.java:585)
at ordermax.JIPTextField$2.insertUpdate(JIPTextField.java:48)
at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:202)
at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:749)
at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:708)
at javax.swing.text.PlainDocument.insertString(PlainDocument.java:130)
at ordermax.JIPTextField$1.insertString(JIPTextField.java:35)
at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:670)
at javax.swing.text.JTextComponent.replaceSelection(JTextComponent.java:1379)
at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(DefaultEditorKit.java:884)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1664)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2926)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2842)
at java.awt.Component.processEvent(Component.java:6282)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:762)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1027)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:899)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:727)
at java.awt.Component.dispatchEventImpl(Component.java:4731)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:696)
at java.awt.EventQueue$4.run(EventQueue.java:694)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)[/WR]

Nach ein paar Recherchen hab ich festgestellt, daß der Inhalt wohl vom DocumentListener nicht bearbeitet werden darf und dazu irgendein vages Gebrabbel (noch dazu in Englisch...), daß man ein eigenes Document schreiben und insertString() und remove() überschreiben soll.

Mal abgesehen davon, daß ich den DocumentListener wegen seiner ganzen sinnlosen Kompliziertheit und Unlogik verabscheue frage ich mich, wie ich das hinkriegen soll ?

Jemand mehr Erfahrungen mit dem DocumentListener als ich ?

Lg
 

KSG9|sebastian

Top Contributor
Sowas hier ist gemeint:

Code:
JTextArea area = new JTextArea(10, 100);
        area.setDocument(new PlainDocument() {
            @Override
            public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
                try {
                    Integer.parseInt(str);
                    // integer - insert ok
                    super.insertString(offs, str, a);
                } catch (NumberFormatException nfe) {
                    // no number, reject insert
                }
            }
        });
Anstatt eines Listeners kannst du die Prüfungen direkt im Document erledigen.
Obiges Beispiel erlaubt nur die Eingabe von Zahlen..damit kannst du das Problem bestimmt lösen.

Andere Möglichkeit (habe ich nicht Probiert) wäre über den DocumentFilter..

siehe [JAPI]javax.swing.text.AbstractDocument[/JAPI] bzw [JAPI]javax.swing.text.DocumentFilter[/JAPI]
 

TheJavaKid

Top Contributor
Leider nicht - die Überprüfung auf Zahlen hab ich schon - es geht ja darum ob die Zahl <= 255 ist - ich hab schon super.getText(0,3); versucht um den gesamten Inhalt des Feldes zu bekommen, aber das funktioniert genauso wenig...
 

Melfis

Aktives Mitglied
Wenn du schon kontrollierst ob die eingabe eine Zahl ist, wieso kontrolierst du nicht an selber stelle den Wert dieser Zahl? Beispiel:

Java:
public class IPDocument extends PlainDocument
{
   public void insertString(int offset, String s, AttributeSet attributeSet) throws BadLocationException
    {
      int i;
      boolean ok=true;

      try{
             i=Integer.parseInt(s);
         }
         catch(Exception ex)   //only allow integer values
         {
         ok=false;
         }
      if(i<0||i>255)ok=false;
      if(!ok){
            Toolkit.getDefaultToolkit().beep();
            return ;
      }
      super.insertString(offset,s, attributeSet);
    }
}

Würde aber einen InputVerifier empfehlen, ist für den Nutzer der Eingabe angenehmer.

MFG Melfis
 

KrokoDiehl

Top Contributor
Du kannst dir auch mal ein JFormattedTextField anschauen. In einem Listener zu ändern ist der falsche Ansatz und könnte schlimmstenfalls zu einem Endlosaufruf führen (... naja, z.G. kommt die Exception ;-)).

Ansonsten gibt es InputVerifier oder eben doch ein eigenes Dokument.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
Y Swing Documentlistener zusammenfassen AWT, Swing, JavaFX & SWT 10
E Swing JTextField und DocumentListener AWT, Swing, JavaFX & SWT 3
C DocumentListener auf mehrere Textfelder AWT, Swing, JavaFX & SWT 5
T JTextField mit DocumentListener beobachten AWT, Swing, JavaFX & SWT 18
Y entfernten String einer JTextPane per DocumentListener AWT, Swing, JavaFX & SWT 5
B JTextArea und JScrollPane und DocumentListener AWT, Swing, JavaFX & SWT 2
C Ändern eines JTextFields bei DocumentListener Event AWT, Swing, JavaFX & SWT 2
Redfrettchen JTextArea während einer DocumentListener Notification ändern AWT, Swing, JavaFX & SWT 5
J DocumentListener uebergibt Objekt; wie in JTextfield casten? AWT, Swing, JavaFX & SWT 3
A setActionCommand für DocumentListener AWT, Swing, JavaFX & SWT 4
K JTextField / DocumentListener AWT, Swing, JavaFX & SWT 3
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
Zeppi Swing Button soll Spiel zurücksetzen AWT, Swing, JavaFX & SWT 5
A Titelleiste soll Pfad ausgeben AWT, Swing, JavaFX & SWT 16
G Eintrag soll nur einmal in Listview zu sehen sein AWT, Swing, JavaFX & SWT 3
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
W JavaFX CSS - was soll mir das sagen? AWT, Swing, JavaFX & SWT 2
D JavaFX Menu soll nicht bei jedem Click verschwinden AWT, Swing, JavaFX & SWT 8
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
O Soll ich einen JEditorPane verwenden ? AWT, Swing, JavaFX & SWT 5
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
T JavaFX Dialog schließt ohne dass es schließen soll AWT, Swing, JavaFX & SWT 1
W Javafx - Image soll sich mit der Camera mitbewegen AWT, Swing, JavaFX & SWT 1
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
A Swing GUI - Button soll Frame verändern AWT, Swing, JavaFX & SWT 4
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
L Swing JButton soll link öffnen AWT, Swing, JavaFX & SWT 1
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
M JavaFX StackedBarChart y-Axis soll nur Integerwerte anzeigen AWT, Swing, JavaFX & SWT 1
A Slider soll einen Wert übergeben AWT, Swing, JavaFX & SWT 1
P JavaFX Slider soll Value erst ab einer bestimmten Bedinung aendern AWT, Swing, JavaFX & SWT 19
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
V JScrollBar soll weiterscrollen, wenn Inhalt von JTextArea erweitert wird AWT, Swing, JavaFX & SWT 7
V Swing Button soll unter anderem Button sein AWT, Swing, JavaFX & SWT 2
P Fenstergröße ändern, Panel soll gleich bleiben AWT, Swing, JavaFX & SWT 2
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
T MausClick soll TExt ändern AWT, Swing, JavaFX & SWT 6
J JavaFX Tabelle soll ganze Seite ausfüllen AWT, Swing, JavaFX & SWT 2
D Swing Schließen von JDialog soll auch JFrame schließen. AWT, Swing, JavaFX & SWT 4
T SWT SWTBot Test: Dialog soll sich öffnen,wenn button gedrückt AWT, Swing, JavaFX & SWT 3
T SWT Button soll nur sichbar sein,wenn im Textfeld der Focus ist AWT, Swing, JavaFX & SWT 4
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
C 2D Grafik ein Bild soll permanent durchlaufen AWT, Swing, JavaFX & SWT 2
windl Warum soll ich zu JavaFX? AWT, Swing, JavaFX & SWT 18
H Java3D, ViewP Translattform soll sich nach einerformgroup richten. AWT, Swing, JavaFX & SWT 5
S Hauptfenster soll geöffnet bleiben AWT, Swing, JavaFX & SWT 4
M JDialog soll JFrame "blockieren" AWT, Swing, JavaFX & SWT 2
D Image soll langsam sichtbar werden AWT, Swing, JavaFX & SWT 4
F Swing JTextfield Beispieltext soll nach Klick verschwinden AWT, Swing, JavaFX & SWT 3
J Zwei GUIs - Nach button-Klick soll ein Wert an die andere GUI übergeben werden AWT, Swing, JavaFX & SWT 15
J Swing String soll als Variable dienen AWT, Swing, JavaFX & SWT 11
M EditorPane Inhalt anders als er soll! AWT, Swing, JavaFX & SWT 2
C LayoutManager Grafik soll nicht im GridLayout Skalieren AWT, Swing, JavaFX & SWT 3
M Swing ActionEvent soll von Anderem ActionEvent abhängen AWT, Swing, JavaFX & SWT 3
J Button soll nach Klick Text ändern und Programm in 3 Sekunden beenden AWT, Swing, JavaFX & SWT 6
H Swing Button Klick soll "Untermenü-Buttons" erzeugen AWT, Swing, JavaFX & SWT 2
Z Swing JPanel soll größer werden als Parent Container (überlappen) AWT, Swing, JavaFX & SWT 5
D Swing jSlider soll selber weiterwandern, je nach zeit der musik AWT, Swing, JavaFX & SWT 5
A SWT Tooltip soll nicht verschwinden, solange User mit Maus auf Control ist AWT, Swing, JavaFX & SWT 5
D Swing JProgressBar soll ende erkennen AWT, Swing, JavaFX & SWT 4
S JVM von Oracle/Sun soll für AWT/SWING Elemente die die Optimierungen der NVidia Treiber verwenden AWT, Swing, JavaFX & SWT 3
J Swing JDialog blokiert mehrere JFrames - soll aber nur den aufrufenden blockieren AWT, Swing, JavaFX & SWT 4
N Applet JButton soll html Datei aus einem Ordner öffnen AWT, Swing, JavaFX & SWT 2
Z Bei Klick auf JButton soll ein anderer JButton erscheinen AWT, Swing, JavaFX & SWT 4
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
X Swing Bei Buttonklick soll PopupMenu erscheinen AWT, Swing, JavaFX & SWT 2
M Dialog soll etwas an "Oberklasse" übergeben AWT, Swing, JavaFX & SWT 3
qwerqer Swing Anwendung soll blinken (Taskleiste) AWT, Swing, JavaFX & SWT 3
2 Anfänger problem: Buttenklick soll reagieren AWT, Swing, JavaFX & SWT 9
D JTextField soll nur Integer als Eingabewert annehmen AWT, Swing, JavaFX & SWT 5
N JFreeChart: Plot soll mit skalieren AWT, Swing, JavaFX & SWT 5
J Schließen über x soll zwei Prozesse beenden AWT, Swing, JavaFX & SWT 7
T disabled Checkbox soll trotzdem Focus bekommen AWT, Swing, JavaFX & SWT 9
R Button soll nach dem er gedrückt wurde auf setVisible(false) gestellt werden. AWT, Swing, JavaFX & SWT 3
F JTable soll mit Buttons befüllt werden, aber nicht in jede Zelle einer Spalte AWT, Swing, JavaFX & SWT 3
P 2D-Grafik String übergeben, PNG soll rauskommen AWT, Swing, JavaFX & SWT 9
B Text soll nich über das Frame hinausgehen AWT, Swing, JavaFX & SWT 5
-horn- WorldWindJava+JOGL soll einen animierten Graphen anzeigen, wie? AWT, Swing, JavaFX & SWT 4
Y JRadioButton soll JTextBox aktivieren UND deaktivieren AWT, Swing, JavaFX & SWT 3
M Swing JTable soll auf ArrayList zugreifen AWT, Swing, JavaFX & SWT 8
GianaSisters Swing jTable - Feldtext soll mehrere Zeilen haben AWT, Swing, JavaFX & SWT 3
H Applet JApplet soll neues Tab im Browser öffnen AWT, Swing, JavaFX & SWT 2
T Swing jTextArea soll sich der Fenstergröße anpassen beim ziehen?? AWT, Swing, JavaFX & SWT 2
S Swing JTabbedPane: Inhalt soll oben links anfangen AWT, Swing, JavaFX & SWT 6
kodela Clipboard übernimt mehr als es soll AWT, Swing, JavaFX & SWT 15
N Button soll die Größ eines Icons haben AWT, Swing, JavaFX & SWT 5
M Menübar soll bestehen bleiben, wenn andere Masken geöffnet werden AWT, Swing, JavaFX & SWT 4
J Swing Kalender soll auf Buttondruck einen Monat weiterblättern AWT, Swing, JavaFX & SWT 7
F Rechte Maustaste auf TreeNode soll den Fokus auf diese setzen AWT, Swing, JavaFX & SWT 6
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
S Item einer JComboBox soll variabel sein AWT, Swing, JavaFX & SWT 3
D GridBagLayout macht nicht das was es soll AWT, Swing, JavaFX & SWT 12
M Swing JTextPane mit JScrollPane soll aussehen wie JLabel AWT, Swing, JavaFX & SWT 3
X JTable soll im JScrollpane bei .add mitscrollen. AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben