Listener Verständnisproblem

HazelNut

Mitglied
Hey,
wie der Titel schon sagt bin bräuchte ich mal eine kleine Erklärung für Listener, habe bereits einige Tutorials durchgelesen aber nicht ganz verstanden (auch hier im FAQ).

Also die Klassen:
DataObject, welches sämtliche Daten hält. (wobei es sich um ~20 verschiedene Attribute handelt.)
Database, wo wie persistent gespeichert sind.
DataList, eine Liste von DataObjects
gui...

In der gui werden mir die Daten von dataObject schön angezeigt, nun möchte ich welche ändern und habe zum Speichern einen Edit Button.
Wenn ich diesen betätige rufe ich ein Objekt von DataChangeEvent auf.
Diesem Objekt wird was übergeben?
Vermutlich der Name des gerade bearbeitetem DataObject und dann noch sämtliche Attribute.
Oder wäre es besser die setter von DataObject direkt in der gui zu machen, aber dann würde es wieder zu so einer gemeinen Bindung kommen.
Wie sollte ich die Daten nun am besten ändern?
Vor allem, sollte ich dann von ChangeEvent einfach nur die Daten an die DataList weitergeben und diese dort verändern oder das DataObject schon in ChangeEvent.
Was ist dann mit der Database?
Soll ich von ChangeEvent die datenbank und die liste verständigen oder nur die Liste und von dort aus die Datenbank updaten?

Ich habe dazu jetzt keinen Java Code, ist nur ein Gedankengang.
Also:

Java:
class gui{
add btn
btn.addActionListener(new DataChangeEvent(DataObject));
}

class DataChangeEvent implements ActionListener{
DataObject obj;
public DataChangeEvent(DataObject){ //oder auch die Attribute??
this.obj=DataObject;
}

public void actionPerformed(ActionEvent e){ //Hier dann alles zusammensetzen? Dann müsste ich aber auch von der gui sämtliche Felder erhalten.

//oder an DataList weiterleiten?

}

Obwohl ich ja eigentlich bereits alles in der actionPerformed machen kann und dann mit ner Methode dort auch die DB updaten...

Ich sehe zwar, das bei jedem Listener Beispiel ein Interface implementiert wird aber ich verstehe nicht ganz wozu ich es hier benötigen würde.
 

bERt0r

Top Contributor
Nein da hast du was falsch verstanden:
Die Funktion "addActionListener" fügt deinem Button einen Listener hinzu, kein Event.
Ein Event ist ein Objekt, das einen Listener über ein Ereignis informiert. Der Listener ist dafür zuständig dieses Event Objekt zu verarbeiten.
Ein Button wirft z.B ein "ActionEvent" wenn er gedrückt wird. Um darauf zu reagieren gibst du dem Button einen "ActionListener". Der kann z.B so aussehen:
Java:
class MyActionListener implements ActionListener
{
  @Override
  public void actionPerformed(ActionEvent e)
  {
    System.out.println("Ich wurde gedrückt!");
  }
}

Wenn du etwas an deinen Daten ändern willst, musst du das in dieser ActionPerformed Methode machen oder zumindest in die Wege leiten.

Und ja, höchstwahrscheinlich musst du von deiner actionPerformed Methode dann auf die Felder in deiner GUI zugreifen. Dafür brauchst du dann entweder setter/getter oder du schreibst deinen Listener als interne Klasse deiner GUI. Ich schreibe Listener immer als anonyme Klassen, die können dann meist auf alle notwendigen Komponenten in der GUI zugreifen:
Java:
JButton button=new JButton();
button.addActionListener(new ActionListener(){
  @Override
  public void actionPerformed(ActionEvent e)
  {
    System.out.println("Ich wurde gedrückt!");
  }
});
 
Zuletzt bearbeitet:

HazelNut

Mitglied
hmm dann so?:

Java:
class DataChangeEvent extends EventObject{

}

interface DataChangeListener extends ActionListener{
}

class DataChangeListenerImpl implements DataChangeListener{
//von hier aus dann die datalist und die datenbank updaten?
}

main{

btn.addActionListener(new DataChangeListenerImpl());

Wozu benötige ich dann die Event Klasse?
Und was für sollte ich dann dem DataChangeListenerImpl übergeben?
Gar nix, und in der Impl durch getter von der gui sämtliche Datenfelder holen?

Und eine Zusatzfrage:
Wäre es intelligenter wenn ich alles einzeln editiere oder alles in einem Zug?
Sprich ich habe 20 felder auf meiner gui, dessen werte eben in einem DataType gespeichert sind.
sollte ich dann einen Edit button machen und dann alles setzen oder aber bei jedem TextField einen Listener dranhängen und nur einzeln zusammensetzen?
 

Landei

Top Contributor
Das brauchst du alles nicht. Du hast keine Möglichkeit, dem ActionListener alle Daten mitzugeben, die muss er selbst einsammeln.

Bastele erst einmal eine ganz normale Methode, mit der du dein Datenobjekt updaten könntest:

Java:
public class DataObject {

   public void update(String umsatzsteuerIdentifikationsNummer, int anzahlZwerge) {
       //mach was damit
   }

}

In deiner GUI solltest du ja eine Referenz auf dein Datenobjekt haben (ein Controller nach dem MVC-Muster wäre hübscher, aber wir wollen ja erst mal einfach anfangen), und ein paar GUI-Elemente wie Textfelder, die erst mit den Original-Werten initialisiert werden, und sich dann ändern. Dann sieht das ungefähr so aus (der Listener ist hier als anonyme Klasse ausgeführt, es geht auch anders, ist aber hier recht üblich so):

Java:
public class GUI {
  JTextField umsatzsteuerIdentifikationsNummernFeld = ...
  JTextField anzahlZwergeFeld = ...
  DataObject dataObject;

  public GUI(DataObject dataObject) {
     this.dataObject = dataObject;
     umsatzsteuerIdentifikationsNummernFeld.setText(dataObject.getUmsatzsteuerIdentifikationsNummer());
     anzahlZwergeFeld.setText("" + dataObject.getAnzahlZwerge());
     Button updateButton = new Button("Save Changes");
     //adde das ganze Zeug zur GUI ...
    
     //und dann der Listener
     updateButton.addActionListener( new ActionListener() {
         public void actionPerformed(ActionEvent ae) {
             dataObject.update(
                 umsatzsteuerIdentifikationsNummernFeld.getText(),
                 Integer.parseInt(anzahlZwergeFeld.getText())
             ); 
         }    
     });  
  } 
   
}
 
S

SlaterB

Gast
Listener kommen in der Tat oft ohne Event aus, beim ActionListener eines Buttons brauche ich das ActionEvent praktisch nie,

wenn du nur eine DataChangeListenerImpl-Klasse haben wirst, vielleicht gar nur ein Objekt, dann kannst du dir mindestens
das extra-Interface sparen, da muss man aufpassen dass man nicht für die Galerie sinnlose Strukturen schafft

deine gesamten Frageberge sind überhaupt viel zu allgemein und gleichzeitig auch viel zu detailliert,
kein Mensch interessiert wirklich, wie du deine Objekte irgendwie updatest, ob Liste oder DB oder Controller dazwischen oder was auch immer,
und du selber lernst nur durch theoretische Vorüberlegungen auch nicht so viel

meine Tipps:
- fange alles einfach an, teste erstmal nur mit 1 Attribut statt 20, baue nicht stundenlang Methoden mit Parameterlisten,
die bald dann doch wieder verschwinden
- für den Anfang nicht zu sehr auf Bindung, Interface usw. achten, auch ist erstmal eine statisches GUI-Objekt erlaubt,
erst wenn alles halbwegs läuft und Probleme ohne/ Nutzen durch z.B. Interface sichtbar werden, kann nachgerüstet werden
- Detailfragen wie wer nun die Textfelder ausliest, ob der Listener mit der DB oder der Liste spricht, klären sich während der Implementierung, kann auch zwischendurch wechseln

wenn man alles ein wenig kennt und einschätzen kann, und ernsthafte Programme baut, dann lohnt sich größere Planung
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Was heißt es mit FXML Listener zu setzen ind Buttons zu erstellen? Allgemeine Java-Themen 6
L Wie programmiert man einen Listener? Allgemeine Java-Themen 1
S Threads Serielle Schnittstelle mit Listener / Aufrufendes GUI Allgemeine Java-Themen 4
D Action Listener Problem Allgemeine Java-Themen 3
S Key Listener mit Strg + s Allgemeine Java-Themen 12
K Threads Listener für Future finish Allgemeine Java-Themen 2
TheWhiteShadow Listener Reihenfolge Allgemeine Java-Themen 4
D Listener auf System.out.err / System.out.println Allgemeine Java-Themen 5
A Listener für constructor einer bestimmen Klasse Allgemeine Java-Themen 9
E Bild mit Listener einfügen Allgemeine Java-Themen 3
P Listener für Tastatureingaben ohne Focus Allgemeine Java-Themen 4
serjoscha WatchDog Thread und Listener Allgemeine Java-Themen 10
hdi Listener für Desktop-Veränderungen Allgemeine Java-Themen 7
T JTextField in Listener leeren Allgemeine Java-Themen 2
lenniii Listener & JList Allgemeine Java-Themen 3
K Key listener ohne Fokus aktiv behalten ? Allgemeine Java-Themen 12
G Code-Convention für Listener Allgemeine Java-Themen 2
T Observer vs Listener Allgemeine Java-Themen 18
S Listener Allgemeine Java-Themen 3
P Abstrakte Elternklasse als Listener Allgemeine Java-Themen 6
MQue KeyAction listener Allgemeine Java-Themen 2
M generische Listener Allgemeine Java-Themen 2
S Listener für Kalender Allgemeine Java-Themen 2
B Observer vs Listener (GUI-Programmierung) Allgemeine Java-Themen 5
J Listener für Ende eines Threads gesucht... Allgemeine Java-Themen 5
S Listener Implentierung bei Eingabe in Textfeld Allgemeine Java-Themen 2
G Objekt einer inneren Klasse als Listener Allgemeine Java-Themen 3
D Boolean Listener? Allgemeine Java-Themen 28
M Listener und Performance Allgemeine Java-Themen 9
D Observer/Observable Pattern vs. Listener-Konzept Allgemeine Java-Themen 4
G Listener auf aktuelles Datum / Uhrzeit Allgemeine Java-Themen 2
Escorter Eigenen Listener schreiben Allgemeine Java-Themen 3
E Gibt es so etwas wie einen Windows Listener? Allgemeine Java-Themen 6
T SelectionProvider und Listener Frage Allgemeine Java-Themen 14
I Listener, der zeitlich-periodisch aufgerufen wird Allgemeine Java-Themen 3
R Generische Listener und Sender Allgemeine Java-Themen 12
B Listener dynamisch setzen Allgemeine Java-Themen 6
A Listener Tastatur Allgemeine Java-Themen 3
E Wie: Eigener Listener, eigenes Event (möglichst einfach) Allgemeine Java-Themen 29
D Thread vs Listener Allgemeine Java-Themen 6
K Listener einem Objekt hinzufügen Allgemeine Java-Themen 3
S Listener-Problematik in komplexem Projekt Allgemeine Java-Themen 2
I Listener/Event selber machen. Allgemeine Java-Themen 4
M Time Listener ? Allgemeine Java-Themen 2
Z Zwei Listener zwischen zwei Klassen Allgemeine Java-Themen 4
B statusbar update -> mit thread oder listener? Allgemeine Java-Themen 7
M Action-listener Allgemeine Java-Themen 6
M Bean Listener hinzufügen und Methode später überschreiben Allgemeine Java-Themen 27
G Flavor-Listener Allgemeine Java-Themen 6
E Listener für Änderung der Fenstergröße Allgemeine Java-Themen 3
W Listener an ein beliebiges Objekt hänger, der mir Änderung Allgemeine Java-Themen 8
Z Problem beim Aufruf eines Listener? Allgemeine Java-Themen 4
A HILFE: subclass von Hashtable mit listener aufstellen Allgemeine Java-Themen 5
S String Encoding Verständnisproblem Allgemeine Java-Themen 22
M Minmax Algorithmus Verständnisproblem Allgemeine Java-Themen 2
S Verständnisproblem beim Mocking Allgemeine Java-Themen 8
stroggi Bytecode LCMP - Verständnisproblem Allgemeine Java-Themen 3
I Verständnisproblem mit nicht vorhandener Klasse Allgemeine Java-Themen 4
K OCJP Beispielfrage.. Verständnisproblem Allgemeine Java-Themen 2
M Java Threads - Wait Notify - Verständnisproblem Allgemeine Java-Themen 5
S iText PDF - Verständnisproblem beim Update von TableCells (Seitenzahlen) Allgemeine Java-Themen 2
B Stream Verständnisproblem Allgemeine Java-Themen 2
faulelotte Verständnisproblem Domain Driven Design Allgemeine Java-Themen 3
H Verständnisproblem mit Decimalseperator Allgemeine Java-Themen 2
G Verständnisproblem Allgemeine Java-Themen 11
A Verständnisproblem zur Hashtable Allgemeine Java-Themen 10
A Verständnisproblem Allgemeine Java-Themen 9
A Verständnisproblem mit GregorianCalendar Allgemeine Java-Themen 10
T Verständnisproblem Allgemeine Java-Themen 16
G Verständnisproblem double und float Allgemeine Java-Themen 7
R ResourceBundle-Verständnisproblem Allgemeine Java-Themen 3
M Class#getClassLoader - Verständnisproblem Allgemeine Java-Themen 3
M Verständnisproblem bei mehrdimensionalen Arrays Allgemeine Java-Themen 3
S verständnisproblem bei File Allgemeine Java-Themen 6
L Verständnisproblem ? Allgemeine Java-Themen 3
V Verständnisproblem Eclipse BuildPath <-> Import Jar Fi Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben