Hallo,
ich arbeite gerade ein Tutorial durch, das scheinbar einen Feler hat, den ich nicht lösen kann.
(die 3 problematischen Code-Zeilen: 74, 79, 93)
In der Klasse ImageButton ist eine abstrakte Methode "definiert", die jedoch in der selben Klasse auch wieder innerhalb einer anderen Methode aufgerufen wird.
Was die Methode genau macht ist in der Klasse RolloverButton definiert, die ImageButton "extends".
Ich dachte eigentlich, dass abstrakte Methoden beim deklarieren keine Übergabeparameter haben,
allerdings motzt dann eclipse. Gibt es eine Möglichkeit anzugeben, dass die abstrakte Methode mit 2 Übergabeparametern vom Typ boolean arbeiten wird?
Oder woran liegt es, dass ich in diesem Fall Fehler bekomme und bei der Deklaration von handleMousePressed() nicht (auch diese Methode wird innerhalb einer anderen Methode in der Klasse auch noch einmal aufgerufen in Code Zeile 64 / 95).
Anbei der Code mit der Hoffnung, dass ihr mir helfen könnt:
[/code]
ich arbeite gerade ein Tutorial durch, das scheinbar einen Feler hat, den ich nicht lösen kann.
(die 3 problematischen Code-Zeilen: 74, 79, 93)
In der Klasse ImageButton ist eine abstrakte Methode "definiert", die jedoch in der selben Klasse auch wieder innerhalb einer anderen Methode aufgerufen wird.
Was die Methode genau macht ist in der Klasse RolloverButton definiert, die ImageButton "extends".
Ich dachte eigentlich, dass abstrakte Methoden beim deklarieren keine Übergabeparameter haben,
allerdings motzt dann eclipse. Gibt es eine Möglichkeit anzugeben, dass die abstrakte Methode mit 2 Übergabeparametern vom Typ boolean arbeiten wird?
Oder woran liegt es, dass ich in diesem Fall Fehler bekomme und bei der Deklaration von handleMousePressed() nicht (auch diese Methode wird innerhalb einer anderen Methode in der Klasse auch noch einmal aufgerufen in Code Zeile 64 / 95).
Anbei der Code mit der Hoffnung, dass ihr mir helfen könnt:
Code:
import java.awt.*;
import java.awt.event.*;
import java.util.Hashtable;
public abstract class ImageButton extends Component {
// nur für abgeleitieten Klassen zugänglich
protected Hashtable imageHash; //Bildname zum Ansprechen
protected Image image;
protected String imageName;
protected boolean isMouseDown = false;
protected boolean isMouseInside = false;
protected String actionCommand; // erlaubt den Objekten, die vom Button ein ActionEvent erhalten die Quelle der Nachricht zu bestimmen
protected ActionListener listener = null;
public ImageButton(){
//Listener registrieren
Mouse aMouse = new Mouse();
this.addMouseListener(aMouse);
//Status-Information initialisieren
imageHash = new Hashtable();
actionCommand = "ImageButton Action";
}
/*
* Zeichnet den Button
* wird aufgerufen, wenn die Komponente zum ersten Mal aufgerufen wird oder eine Update-Nachfrage vorliegt
* @parameter: g > für die Grafik spezifiertes Fenster
*/
public void paint(Graphics g){
//"Super-Klasse" zeichnet, dann die Zeichnung des aktuellen Bilds hier behandeln
super.paint(g);
if (image != null){
g.drawImage(image, 0, 0, this);
}
}
//innere Klasse zum Behandeln von Mouse-Events
class Mouse extends MouseAdapter{
public void mouseExited(MouseEvent event){
ImageButton_MouseExited(event);
}
public void mouseEntered(MouseEvent event){
ImageButton_MouseEntered(event);
}
public void mouseReleased(MouseEvent event){
ImageButton_MouseReleased(event);
}
public void mousePressed(MouseEvent event){
ImageButton_MousePressed(event);
}
}
protected void ImageButton_MousePressed(MouseEvent event){
isMouseDown = true;
handleMousePressed();
}
protected void ImageButton_MouseReleased(MouseEvent event){
isMouseDown = false;
handleMouseRelease(isMouseInside);
}
protected void ImageButton_MouseEntered(MouseEvent event){
isMouseInside = true;
handleRollover(isMouseInside,isMouseDown);
}
protected void ImageButton_MouseExited(MouseEvent event){
isMouseInside = false;
handleRollover(isMouseInside,isMouseDown);
}
/*
* Wird aufgerufen, wenn gedrückter Button losgelassen wird
* @parameter: isMouseInside > true wenn Maus im Buttonbereich geortet wird
* @parameter: isMouseInside > false ... do nothing
*/
protected void handleMouseRelease(boolean isMouseInside){
if(isMouseInside)
fireActionEvent();// sended Nachrichten zu allen Objekten, die für den Button als Listener registriert sind um sie zu informieren, dass der Button gedrückt wurde
}
protected abstract void handleRollover(); // Implementiert in RolloverButton.java
protected abstract void handleMousePressed(); // Implementiert in RolloverButton.java
/*
* Legt ein Bild auf den Button
* @parameter: imagePath > Ort der Bildquelle (relative Pfadangabe)
* @parameter: imageName > Referenz-Name des Bilds (nicht der Dateiname), identifiziert Bild für späteren Einsatz im Button
*/
public void addImage(String imagePath,String imageName){
//Anforderungen für Hashtable nicht erfüllt > Methode verlassen
if(imageName !=null && !imageName.equals("")){
Image newImage = Misc.loadImage(imagePath, this,true);
if(newImage != null){
imageHash.put(imageName,newImage);
}
}
}
/*
* Loescht das Bild eines Buttons
* @parameter: imageName > Referenz-Name des Bilds
*/
public void removeImage(String imageName){
//Anforderungen für Hashtable nicht erfüllt > Methode verlassen
if(imageName !=null && !imageName.equals("")){
imageHash.remove(imageName);
}
}
/*
* Aendert das Bild eines Buttons
* @parameter: imageName > Referenz-Name des Bilds
*/
public void setImage(String imageName){
//Anforderungen für Hashtable nicht erfüllt > Methode verlassen
if(imageName !=null && !imageName.equals("")){
Image temp = (Image)imageHash.get(imageName);
if(temp != null){
image = temp;
this.imageName = imageName;
repaint();
}
}
}
/*
* Liefert den Namen des aktuellen Bilds
* @return: Referenz-Name des Bilds
*/
public String getImage(){
return imageName;
}
/*
* Setzt den command-Namen des Action Events, das vom Button ausgelöst wurde
*/
public void setActionCommand(String command){
actionCommand = command;
}
/*
* Gibt den command-Namen des Action Events, das vom Button ausgelöst wurde, zurück
*/
public void getActionCommand(ActionListener l){
listener = AWTEventMulticaster.add(listener,l);
}
/*
* Entfernt eeinen bestimmten Action Listener, damit der Button keine Events mehr von Ihm erhält
*/
public void removeActionListener(ActionListener l){
listener = AWTEventMulticaster.remove(listener,l);
}
/*
* "Feuert" ein Action Event zu den Listenern
*/
protected void fireActionEvent(){
if (listener != null){
listener.actionPerformed(new ActionEvent (this, ActionEvent.ACTION_PERFORMED, actionCommand));
}
}
/*
* Gibt die bevorzugte Größe des Buttons zurück, damit der LayoutManager die Buttongröße kalkulieren kann
* überschreiben der Methode von java.awt.Component
*/
public Dimension getPreferredSize(){
if (image != null){
return new Dimension(image.getWidth(this),image.getHeight(this));
}
return super.getPreferredSize(); // default-Verhalten der Komponente benutzen
}
}