Listener und Events

  • Themenstarter Themenstarter Chewie
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
C

Chewie

Gast
Hallo, bin noch Anfänger und weiss nicht ganz wie ich das bewerkstelligen soll.
Ich hab eine Klasse mit einen Listener und eine Testklasse wo ich ein Objekt dieser Klasse hab ich ein Objekt dieser Klasse. Wenn jetzt beim Objekt ein Event eintrift wie kann ich die Testklasse das Mitteilen? Hab schon im Internet rumgesucht aber nichts gefunden
 
Der Listener müßte die Testklasse kennen. Besser (sauberer getrennt) wäre es vielleicht, wenn die Testklasse SELBST ein Listener wäre, der sich am Objekt registriert.
 
Hm also soll ich im Objekt den Listener entfernen und der Testklasse hinzufügen? Hm aber wenn ich jetzt ein dutzend solcher Klassen hab, sollen dann auch alle Eventlistener in die Testklasse?
 
Die Benutzung von Event Listeners, um Events zu verarbeiten, können wir als
dreistufigen Prozess sehen:
1. Wir definieren eine Klasse A, die die passende Listener Schnittstelle
implementiert (dies schließt die Implementierungen für alle Methoden der Schnittstelle ein).
2. Wir erzeugen eine Instanz dieses Listeners.
3. Wir registrieren diesen Listener bei der Klasse B,
dessen Events uns interessieren.

Die meiste Entwicklungsarbeit verbirgt sich in der Implementation der Klasse B,
da sie die Event Listener verwalten und die passenden Events an sie abfeuern muss.
Die Implementation der Event Listener ist meist trivial. Ausserdem braucht eine Klasse nur dann
einen Listener zu implementieren, wenn sie an den entsprechenden Events interessiert ist.
 
Hast du vielleich ein Beispiel mit Code? Bin nicht so sicher wie ich das umsetzten soll.
 
So sieht das bei Swing aus, läßt sich aber leicht was analoges selber bauen...
Code:
//irgendwo beim Aufbauen der GUI
JButton button = new JButton("Drück mich!");
frame.getContentPane().add(button, BorderLayout.SOUTH);
...
//registrieren eines Listeners
button.addActionListener(new MyListener());

...
//die Listener-Klasse
public class MyListener extends ActionListener {
   public void actionPerformed(ActionEvent ae) {
      System.out.println("Autsch, nicht so fest!");
   }
}
 
Also mal sehen ob ich das jetzt richtig verstanden hab ja?

Ich habe meine Klasse
Code:
class MyPanel extends JPanel implements MouseListener{
boolean selected;
mit den passenden Methoden
Code:
	@Override
	public void mouseClicked(MouseEvent e) {
		if(selected)
                  selected=false;
                else
		  selected=true;
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		this.setBorder(BorderFactory.createLineBorder(red));
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		this.setBorder(BorderFactory.createLineBorder(black));
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
In meiner Testklasse erstelle ich ein Objekt davon und gebe dem dann einen Listener
Code:
JPanel mpanel = new MyPanel();
JLabel label= new JLabel();
....
mpanel.addMouseListener(new Mylistener());
...
public class MyListener extends MouseListener{
@Override
	public void mouseClicked(MouseEvent e) {
		label.settext("wurde gedrückt");
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
}

Ist das jezt soweit richtig?
 
Gast hat gesagt.:
Ja. (Ich gehe mal davon aus in MyListener ist das label bekannt)
Ja das Label ist für den MyListener bekannt. Der MyListener ist ja ein Unterobjekt von der Testklasse.

Kommt mir nur komisch vor das die ganzen Methoden zwei mal vorkommen überlappen die sich nicht?
Es soll ja einerseits der boolean innerhalb von MyPanel gesetzt werden und anderseits das Label
 
Achsooo jetzt hab ich erst richtig verstanden was du machst 🙂

Funktionieren tuts aber trotzdem nichts desto trotz nutzt du die Methoden in MyPanel nicht. Also schmeiß das Interface mit den zugehörigen Methoden da raus.
 
Chewie hat gesagt.:
Hast du vielleich ein Beispiel mit Code?
DateChooserDemo.zip
1. Die Klasse "DateChooser" implementiert die Listener Schnittstelle "DateSelectionListener ",
was die Implementierungen der Methode "dateSelectionChanged(DateSelectionEvent e)" einschließt.
2. Wir erzeugen eine Instanz dieses Listeners in der main Methode.
3. Wir registrieren diesen Listener bei der Klasse DateSelectionModel,
weil dessen DateSelectionEvents uns interessieren: dateSelectionModel.addSelectionListener(this).

Die Implementierung der Klasse DateSelectionModel zeigt, wie die Event Listeners verwaltet
und die DateSelectionEvents abgefeuert werden.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben