MouseListener <> MouseAdapter. Was ist richtig?


Bobblz

Mitglied
Hallo!

Ich habe die Aufgabe, das eine Folge von GIF-Bildern in einem JFrame durchlaufen und dann beendet werden, wenn ich auf das Bild klicke.
Meine eigentliche Frage ist wie mache ich das mit dem klicken RICHTIG?

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Duke extends JFrame {
	//Attribute
	JLabel Bild = new JLabel(new ImageIcon("C:/Users/Robert/workspace/OOP II/src/T1.GIF"));
	JProgressBar Bar;
	int i = 1;
	int delay = 100;
	Timer T;
	ActionListener taskPerformer = new ActionListener() {
	      public void actionPerformed(ActionEvent evt) {
	    	  
	     	  String s ="C:/Users/Robert/workspace/OOP II/src/T"+i+".GIF";
	     	  Bild.setIcon(new ImageIcon(s));
	     	  Bar.setValue(i);
	      	  i++;
	      	  if (i>=11){
	      		  i = 1;
	      	  }
	      }		      
	};
	MouseListener a = new MouseListener() {
		
		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mouseClicked(MouseEvent e) {
			T.stop();
			
		}
	};
	
	//Methoden
	void run(){
		T = new Timer(delay, taskPerformer);
		T.start();
	}
	
	//Konstruktor
	Duke(){
		super("Duke");
		setSize(800,600);
		setLayout(new BorderLayout());
		Bar  = new JProgressBar(1, 10);
		add(Bild, BorderLayout.CENTER);
		add(Bar, BorderLayout.SOUTH);
		Bild.addMouseListener(a);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new Duke().run();

	}

}

So habe ich es gelöst, allerdings hat ein Kumpel von mir das mittels MouseAdapter gelöst. Wo ist da der Unterschied oder welche Variante ist besser?

Grüße
 

FrankBooth

Erfahrenes Mitglied
Hallo,

da gibt es kein richtig oder falsch würde ich sagen.

Wenn du MouseListener verwendest musst(!) du alle Methoden überschreiben. So hast du es ja auch bei dir schon gemacht.

Benutzt du jedoch MouseAdapter kannst(!) du jede Methode überschreiben. Es ist sonst absolut das gleiche. Dein Kumpel hat halt
nur

Java:
MouseListener a = new MouseAdapter() {

   @Override
   public void mouseClicked(MouseEvent e) {
       T.stop();			
   }
}

... und du hast
Java:
MouseListener a = new MouseListener() {
		
		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mouseClicked(MouseEvent e) {
			T.stop();
			
		}
	};
 
Zuletzt bearbeitet:

Bobblz

Mitglied
Also MouseListener() ist ja ein Interface, soweit ich weis müssen ja ALLE (abstrakten) Funktionen des Interfaces implementiert werden bei der Nutzung.
MouseAdapter() ist eine abstrakte Klasse die bereits MouseListener() implementiert hat, also würden diese Funktionen bereits implementiert und bei der Verwendung in meiner selbsterstellten Klasse muss ich also nur noch die benötigte Funktion reimplementieren und auf meine Wünsche abstimmen.
aber es bleibt doch eine eigentlich nicht instanzierbare abstrakte Klasse

Hab ich das richtig verstanden oder wo ist da jetzt mein Denkfehler?
 

Kai008

Erfahrenes Mitglied
Falls die unterste Zeile keine Frage ist (verstehe sie nicht) sollte es vollkommen richtig sein. Methoden 'implementieren' bzw. 'reinplementieren' nennt man (zumindest in deinen Fall) überschreiben.

Im allgemeinen heißt dass also am besten der Adapter in anonymouse Klassen, oder wenn sich die Klasse nur darum kümmern und von Object erbt (<Classname> is a MouseAdapter), und Listener halt in allen anderen fällen, oder falls du die Methodennamen nicht auswendig weißt (damit deine IDE verfollständigen kann).