Swing Documentlistener zusammenfassen

Yuna

Mitglied
Hallöchen erstmal, ich bin neu hier (Java-Newbie) und hab auch direkt ne kleine Frage.
Bei einem Kleinen Rechner den ich grade erstelle, tippt der User seine Eingaben in JFormattedTextField ein. Damit ich das Ergebnis immer live anzeigen kann habe ich diese Inputfelder mit Documentlistenern versehen ... Das Problem, das ich habe ist, dass ich es nicht schaffe allen Feldern insgesamt nur einen Listener zuzuordnen(sollte doch gehen oder?).

Ergo habe ich aktuell für alle 20 Inputfelder je einen Listener, wie im Bsp.-Code zu sehen

Java:
	public final JFormattedTextField InputEins = new JFormattedTextField();
	public final JFormattedTextField InputZwei = new JFormattedTextField();
        public final JFormattedTextField InputDrei = new JFormattedTextField();
                               ........................................
public void ...

		InputEins.getDocument().addDocumentListener(new DocumentListener() {
			public void changedUpdate(DocumentEvent arg0) {
				Eins();
			}

			public void insertUpdate(DocumentEvent arg0) {
				Eins();
			}

			public void removeUpdate(DocumentEvent arg0) {
				Eins();
			}

			public void Eins() {
				try {
					long a = Long.parseLong(InputEins.getText());
					int b = Integer.parseInt(InputDrei.getText());
					new Rechnung(a, b, "Eins");
					OutputEins.setText(Long.toString(rechnungen.WertEins));
					OutputZwei.setText(Long.toString(rechnungen.WertZwei));
					OutputDrei.setText(Long.toString(rechnungen.WertDrei));
				} catch (Exception e) {

				}
			}
		});
		InputZwei.getDocument().addDocumentListener(new DocumentListener() {
			public void changedUpdate(DocumentEvent arg0) {
				Zwei();
			}

			public void insertUpdate(DocumentEvent arg0) {
				Zwei();
			}

			public void removeUpdate(DocumentEvent arg0) {
				Zwei();
			}

			public void Zwei() {
				try {
					long a = Long.parseLong(InputZwei.getText());
					int b = Integer.parseInt(InputDrei.getText());
					new Rechnung(a, b, "Zwei");
					OutputEins.setText(Long.toString(rechnungen.WertEins));
					OutputZwei.setText(Long.toString(rechnungen.WertZwei));
					OutputDrei.setText(Long.toString(rechnungen.WertDrei));
				} catch (Exception e) {

				}
			}
		});
...etc...usw...


Sprich ich habe pro Inputfeld ~20 Zeilen Code, was die Klasse bei 20 Felden wahnsinnig aufbläht.

Ich hoffe ihr könnt mir helfen und danke schonmal :)
 

tribalup

Bekanntes Mitglied
Bau dir nen eigenen Listener (z.b. SpecialDocumentListener extends DocumentListener)
und dann geht es folgendermaßen
Java:
DocumentListener test=new SpecialDocumentListener;
InputEins.getDocument().addDocumentListener(test);
InputZwei.getDocument().addDocumentListener(test);
InputDrei.getDocument().addDocumentListener(test);
 
C

Camino

Gast
Du könntest eine neue Klasse schreiben, welche von DocumentListener abgeleitet ist und diese dann den Textfeldern mit einem new zuordnen.
 

bERt0r

Top Contributor
Dein Problem fängt doch schon damit an dass du 20 separate Variablen für deine TextFelder hast, pack sie doch einfach in ein Array dann kannst du sie mit einer Schleife bearbeiten.
 

Yuna

Mitglied
Ok, danke für die Hilfe schonmal .. habs erstmal alles umgeschrieben und es klappt soweit auch ....
blos ein Problem hab ich noch mit der Schleife ...
Java:
for(i=0;i==Inputs.length;i++){
			Inputs[i].getDocument().addDocumentListener(new DocumentListener() {
			public void changedUpdate(DocumentEvent arg0) {
				Methode();
			}

			public void insertUpdate(DocumentEvent arg0) {
				Methode();
			}

			public void removeUpdate(DocumentEvent arg0) {
				Methode();
			}

			public void Methode() {
				try {
					long a=0;
					int b=0;
				if(i<11){
					a = Long.parseLong(Inputs[i].getText());
					b = Integer.parseInt(Inputs[i+11].getText());
					}
					else{
						a = Long.parseLong(Inputs[i-11].getText());
						b = Integer.parseInt(Inputs[i].getText());
						}

					new Rechnung(a, b, Typen[i]);

OutputEins.setText(Long.toString(rechnungen.WertEins));
                    OutputZwei.setText(Long.toString(rechnungen.WertZwei));
                    OutputDrei.setText(Long.toString(rechnungen.WertDrei));
                } catch (Exception e) {
 
                }
            }
        });
.........

Ich erstelle die Textfelder jetzt mit arrays und kann diese auch passen abfragen in meiner for-Schleife ...
wenn ich diese Funktion ohne die For-Schleife laufen lasse, mit festgelegtem i-Wert klappt alles,
blos als Schleife gehts nicht... wird wohl daran liegen, dass in dem Fall die Methode die im Listener
erstellt wird immer den Gleichen Namen hat, ... wie behebe ich das ? Kann ich den Methoden-Namen
je nach i-Wert variieren lassen ?

Vielen Dank für weitere Hilfe ! :)
 

Yuna

Mitglied
Die Methode gibt lediglich die vom Benutzer eingegeben Werte an eine andre Klasse weiter, welche mit diesen rechnet.

Der Sinn dahinter ist, dass ich ein Ausgabefeld habe und dort immer live aktualisiert das Ergebnis dieser Rechnung steht und das Ergebnis orientiert sich daran, welches Feld der User im Fokus hat, bzw wo er die letzte Veränderung getätigt hat.
 

bERt0r

Top Contributor
Das geht so nicht. Du darfst auf die Zählvariable einer Schleife von einer Klasse aus zugreifen, die du in der Schleife erstellst. Aus genau dem Grund soll man globale Variablen immer vermeiden, ich frag mich auch ob das überhaupt kompiliert. Schreib dir doch ein eigens File für deinen DocumentListener und verpass ihm einen Konstruktor dem du genau die zwei Komponenten übergibst, bei denen er was ändern soll.
In deiner Schleife schreibst du dann einfach
Java:
components[i].addDocumentListener(new MyDocumentListener(components[i-11],components[i+11]));
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ahmoment, die "Methode" stand da ja schon dabei. Ja, mit einem globalen "i" funktioniert das natürlich nicht, weil die innere Klasse ja nicht "ihr" i bekommt, sondern alle das globale verwenden (welchen Wert auch immer das gerade hat). Mit

Java:
// private int i; // WEG

// for(i=0;i==Inputs.length;i++){ // WEG

// HIN:
for(int j=0;j==Inputs.length;j++){ 
    final int i = j;
    ... // Rest wie vorher...
sollte es gehen.
 

Yuna

Mitglied
Naja ... vielleicht wars leicht missverständlich ausgedrückt ...

Also es kompiliert alles einwandfrei ...
Wenn ich statt der gegeben Schleife die Variable wie folgt fix definiere
Java:
...
for(int z=0;z<=Inputs.length;z++){
	i=0;
...
dann funktioniert alles perfekt ... wenn ich für i ne 0 einsetze funktioniert die erste Box so wie sie soll, wenn ich ne 1 einsetze gehts mit der zweiten Box usw ... nur mit der Schleife gibts da n Problem

€: Marcos Post noch net gesehen ... probiers direkt aus

€2: Super, das klappt soweit ^^ hätte ich auch selbst drauf kommen können, dass der n Problem mit der globalen Variable hat ^^ Riesen Dank !
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben