mouseEntered mit einem Bild im Applet

Status
Nicht offen für weitere Antworten.

Schinken

Mitglied
hallo,

ist es möglich mit mouseEntered zu prüfen ob die Maus über einem Bild (Menupunkt "Spiel starten") ist und daraufhin ein anderes bild an die stelle lädt. also sowas wie bei javascript Mouseover. ich hab schon mal folgenden Code vorbereitet. vielleicht kann mir jemand ein tipp geben. bei google hab ich auch kein richtiges beispiel oder tutorial gefunden.


Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Projekt extends Applet implements MouseMotionListener, MouseListener
{
  Image backImage;
  Image Menu1;
  Image Menu2;
  private TextField tf;

  public void init()
  {
    backImage = getImage (getCodeBase (), "land.jpg");
    Menu1 = getImage(getCodeBase(), "Menu1.gif");
    Menu2 = getImage(getCodeBase(), "Menu2.gif");

    tf = new TextField (30);
    this.add ("South", tf);
    this.addMouseMotionListener(this);     //ich kriegs nur hin das er merkt ob die maus im applet hin aber obs
    this.addMouseListener(this);              //über dem Bild ist nicht.
  }

  public void start(){}
  public void stop(){}
  public void destroy(){}

  public void paint (Graphics g)
  {
     g.drawImage (backImage, 0, 0, this);
     g.drawImage(Menu1, 50, 60, this);
  }

  public void mouseDragged (MouseEvent e){}
  public void mouseMoved (MouseEvent e) {}
  public void mouseClicked (MouseEvent e) {}
  public void mouseEntered (MouseEvent e)
  {
    String s = "Die Maus ist im sensitiven Bereich.";
    tf.setText (s);
  }

  public void mouseExited (MouseEvent e)
  {
    String s = "Die Maus ist abgehauen!";
    tf.setText (s);
  }

  public void mousePressed (MouseEvent e) {}
  public void mouseReleased (MouseEvent e) {}
}
 
Mach das am besten mit der mouseMoved()-Methode.
Stelle dann immer fest, wo sich die Maus befindet.
Die Koordinaten deiner Grafik kennst du ja. Wenn sie sich mit der Mausposition deckt...
So weit klar?
 
g.drawImage(Menu1, 50, 60, this);

meinst du diese Koordinaten?

edit: soll ich die koordinaten in der init methode vergleichen mit einer schleife? oder denk ich wieder kompliziert?
 
Mal ein passendes Beispiel, welches du so in deinem Code ausprobieren kannst:
Java:
//zu den Instanzvariablen
private int xPos = 50, yPos = 60; //Bildkoordinaten

//in die init()-Methode
addMouseMotionListener(new MouseMotionAdapter() {
   public void mouseMoved(MouseEvent e) {
      if(e.getX() > xPos && e.getY() > yPos &&
         e.getX() < xPos + Menu1.getWidth() && e.getY() < yPos + Menu.getHeight()) {
            System.out.println("Die Maus befindet sich über Menu1");
      }
   }
});

//die paint()-Methode
public void paint(Graphics g) {
   g.drawImage (backImage, 0, 0, this); 
   g.drawImage(Menu1, xPos, yPos, this); 
}

Ich hoffe, ich hab jetzt nix verkehrt gemacht.
Probiers mal aus.
 
irgendwie kann ich den mittleren init teil nicht entschlüsseln. ich glaub da ist ein syntax fehler. jedenfalls hab ich das bei mir rumprobiert aber krieg beim kompilieren fehler.

edit: bin noch am anfang von java und entschuldige mich dafür das ich vielleicht einfache sachen nicht sehe.
 
Projekt.java:25: getWidth(java.awt.image.ImageObserver) in java.awt.Image cannot be applied to ()
if(e.getX() > xPos && e.getY() > yPos && e.getX() < xPos + Menu1.getWidth() && e.getY() < yPos + Menu.getHeight())
^
Projekt.java:25: operator + cannot be applied to int,java.awt.Image.getWidth
if(e.getX() > xPos && e.getY() > yPos && e.getX() < xPos + Menu1.getWidth() && e.getY() < yPos + Menu.getHeight())
^
Projekt.java:25: operator < cannot be applied to int,<nulltype>
if(e.getX() > xPos && e.getY() > yPos && e.getX() < xPos + Menu1.getWidth() && e.getY() < yPos + Menu.getHeight())
^
Projekt.java:25: cannot find symbol
symbol : method getHeight()
location: class java.awt.Menu
if(e.getX() > xPos && e.getY() > yPos && e.getX() < xPos + Menu1.getWidth() && e.getY() < yPos + Menu.getHeight())
^
Projekt.java:25: operator + cannot be applied to int,java.awt.Menu.getHeight
if(e.getX() > xPos && e.getY() > yPos && e.getX() < xPos + Menu1.getWidth() && e.getY() < yPos + Menu.getHeight())
^
Projekt.java:25: operator < cannot be applied to int,<nulltype>
if(e.getX() > xPos && e.getY() > yPos && e.getX() < xPos + Menu1.getWidth() && e.getY() < yPos + Menu.getHeight())
^
6 errors


Code:
//in die init()-Methode
addMouseMotionListener(new MouseMotionAdapter() {
   public void mouseMoved(MouseEvent e) {
      if(e.getX() > xPos && e.getY() > yPos &&
         e.getX() < xPos + Menu1.getWidth() && e.getY() < yPos + Menu.getHeight()) {
            System.out.println("Die Maus befindet sich über Menu1");
      }
   }
});  //<<<--- muss das so???
 
Einerseits wurde eine Variable nicht initialisiert, anderseits befinden wir uns in einer inneren Klasse.

<<<--- muss das so???
Muss nicht, aber weil ich innerhalb einer Methode die mouseMoved() aus MouseMotionAdapter überschreibe.
Man spricht hier von einer anonymen Klasse, weil keine Referenz erzeugt wird.
Wenn du mal die Klammernpaare zusammensetzt, wirst du sehen, dass es so passt.
Ich spare mir so die Implementierung von leeren Methoden der Listener-Interfaces.

Ich schreibe mal ein fertiges Beispiel-Applet...
 
ich hab da ein bisschen rumprobiert. wenn ich die größe des bildes manuell eingebe ohne menu1.weidht und height dann geht das applet.
 
sry für die vielen posts. hab aber das applet nun hingekriegt. jetzt hab ich das problem das das applet flüssig im javaeditor läuft aber sobald ich es online stelle bleibt er beim 2 menu bild stehen. also die schrift wird blau aber nicht wieder rot wenn ich mit der maus weggehe.
 
Sorry, hatte in den letzten Tagen ziemlich viel um die Ohren, kann dir erst jetzt antworten.
Heute Nachmittag stelle ich mal ein Beispiel-Applet samt Code online.
 
:arrow: Applet anzeigen

Beispiel-Applet: Wegweiser
Das Applet realisiert eine ImageMap mit MouseOver-Effekt. Um flackerfreies Zeichnen zu demonstrieren wurde zusätzlich Double Buffering (Doppelpufferung) verwendet. Außerdem wird auch gezeigt, wie eine andere Webseite aus einem Applet heraus geladen werden kann.

Der Code des Applets sieht so aus:
Java:
/* Beispiel-Applet: Wegweiser
 * Das Applet realisiert eine ImageMap mit MouseOver-Effekt.
 * Um flackerfreies Zeichnen zu demonstrieren wurde zusätzlich
 * Doublebuffering (Doppelpufferung) verwendet.
 */

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class Wegweiser extends Applet {
  private Graphics offscreenGraphics; //Puffer
  private Image offscreenImage; //Offscreen-Image
  private Image[] images = new Image[5]; //Behälter für Bilder
  private TextField text; //für Textausgaben
  private boolean overGoogle, overForum, operaInit;
  private int googleXPos = 129, googleYPos = 237; //Bildposition
  private int forumXPos = 328, forumYPos = 167; //Bildposition
  private int appletHeight, appletWidth; //Dimension des Applets
  private MediaTracker tracker; //zur Überwachung des Ladens der Bilder
  private String forum = "http://www.java-forum.org";
  private String google = "http://www.google.de";

  /* Initialisieren des Applets */
  public void init() {
    appletHeight = this.getSize().height;
    appletWidth = this.getSize().width;
    tracker = new MediaTracker(this);
    offscreenImage = this.createImage(appletWidth, appletHeight);
    offscreenGraphics = offscreenImage.getGraphics();
  
    loadImages();

    text = new TextField(50);
    text.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        showWebDocument(text.getText().trim());
      }
    });
    this.add(text);
    
    addMouseMotionListener(new MouseMotionAdapter() {
      public void mouseMoved(MouseEvent e) {
        //Maus ist über der Google-Grafik
        if(e.getX() > googleXPos && e.getY() > googleYPos && //linke obere Ecke
          e.getX() < images[1].getWidth(Wegweiser.this)+googleXPos &&
          e.getY() < images[1].getHeight(Wegweiser.this)+googleYPos) {

          if(!overGoogle) { //Nur neuzeichenen wenn nötig
            overGoogle = true;
            repaint();
            text.setText(google);
          }
        }
        else {

          if(overGoogle) { //Nur neuzeichenen wenn nötig
            overGoogle = false;
            repaint();
          }
        }
        
        //Maus ist über der Forum-Grafik
        if(e.getX() > forumXPos && e.getY() > forumYPos && //linke obere Ecke
          e.getX() < images[2].getWidth(Wegweiser.this)+forumXPos &&
          e.getY() < images[2].getHeight(Wegweiser.this)+forumYPos) {

          if(!overForum) { //Nur neuzeichenen wenn nötig
            overForum = true;
            repaint();
            text.setText(forum);
          }
        }
        else {

          if(overForum) { //Nur neuzeichenen wenn nötig
            overForum = false;
            repaint();
          }
        }
      }
    });

    addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        if(overGoogle) {
          showWebDocument(google);
        }

        else if(overForum) {
          showWebDocument(forum);
        }
      }
    });
  }
  
  public void start() {
    //Bilder sind geladen -> (neu)zeichnen!
    repaint();
  }
  
  /* Bilder laden */
  private void loadImages() {
    images[0] = getImage(getCodeBase(), "background.jpg");
    images[1] = getImage(getCodeBase(), "google_off.jpg");
    images[2] = getImage(getCodeBase(), "java-forum_off.jpg");
    images[3] = getImage(getCodeBase(), "google_on.jpg");
    images[4] = getImage(getCodeBase(), "java-forum_on.jpg");

    for(int i = 0; i < images.length; i++) {
      tracker.addImage(images[i], 0);
    }
    
    try {
      tracker.waitForID(0);
    }
    catch(InterruptedException e) {
      e.printStackTrace();
    }
  }
  
  /* Webseite laden */
  private void showWebDocument(String url) {
    try {
      getAppletContext().showDocument(new URL(url), "_blank");
    }
    catch(MalformedURLException murle) {
      text.setText("URL fehlerhaft oder nicht erreichbar!");
    }
  }

  /* Ältere Versionen von Opera haben Schwierigkeiten beim Start von Applets mit Doublebuffering.
   * Daher wird für den Opera nach Applet-Initialisierung ein Startzustand
   * gezeichnet, um ein leeres Applet nach dem Start zu vermeiden.
   */
  private void operaInit() {
    offscreenGraphics.drawImage(images[0], 0, 0, this);
    offscreenGraphics.drawImage(images[1], googleXPos, googleYPos, this);
    offscreenGraphics.drawImage(images[2], forumXPos, forumYPos, this);
    operaInit = true;
  }

  /* Bild im Hintergrund (Speicher) zusammensetzen
  update() ist die Reaktion auf repaint() */
  public void update(Graphics g) {
    offscreenGraphics.drawImage(images[0], 0, 0, this);
    
    if(overGoogle) {
      offscreenGraphics.drawImage(images[3], googleXPos, googleYPos, this);
      offscreenGraphics.drawImage(images[2], forumXPos, forumYPos, this);
    }

    else if(overForum) {
      offscreenGraphics.drawImage(images[1], googleXPos, googleYPos, this);
      offscreenGraphics.drawImage(images[4], forumXPos, forumYPos, this);
    }
    
    else {
      offscreenGraphics.drawImage(images[1], googleXPos, googleYPos, this);
      offscreenGraphics.drawImage(images[2], forumXPos, forumYPos, this);
    }

    g.drawImage(offscreenImage, 0, 0, this); //Offscreen-Image auf den Screen kopieren
  }
  
  public void paint(Graphics g) {
    if(!operaInit)
      operaInit();

    if(offscreenImage != null)
      g.drawImage(offscreenImage, 0, 0, this);
  }
}
 
Zuletzt bearbeitet:
danke, finde das applet sieht echt gut aus.sieht aber bisschen komplex aus :roll: . ich kann ja mal meins posten

Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;


public class Projekt extends Applet implements MouseMotionListener, MouseListener
{
  Image backImage;
  Image Menu1, Menu2, Menu3, Menu4;
  private int xPos = 50, yPos = 60;
  private Image dbImage;
  private Graphics dbg;

  public void init()
  {
    backImage = getImage (getCodeBase (), "land.jpg");
    Menu1 = getImage(getCodeBase(), "Menu1.gif");
    Menu2 = getImage(getCodeBase(), "Menu3.gif");

    this.addMouseMotionListener(this);
    //this.addMouseListener(this);

  }

  public void start(){}
  public void stop(){}
  public void destroy(){}

  public void paint (Graphics g)
  {
     g.drawImage(backImage, 0, 0, this);
     g.drawImage(Menu1, xPos, yPos, this);
     g.drawImage(Menu2, 100, 130, this);
  }

  public void mouseDragged (MouseEvent e){}
  
  public void mouseMoved (MouseEvent e)
  {
   if(e.getX() > xPos && e.getY() > yPos &&
         e.getX() < xPos + 198 && e.getY() < yPos + 43)
   {
     Menu1 = getImage(getCodeBase(), "Menu2.gif");
     repaint();
   } else {
     Menu1 = getImage(getCodeBase(), "Menu1.gif");
     repaint();
   }
   
   if(e.getX() > 100 && e.getY() > 130 &&
         e.getX() < 100 + 85 && e.getY() < 130 + 20)
   {
     Menu2 = getImage(getCodeBase(), "Menu4.gif");
     repaint();
   } else {
     Menu2 = getImage(getCodeBase(), "Menu3.gif");
     repaint();
   }
  }
  
  public void update (Graphics g)
  {
    // Initialisierung des DoubleBuffers
    if (dbImage == null)
    {
      dbImage = createImage (this.getSize().width, this.getSize().height);
      dbg = dbImage.getGraphics ();
    }

    // Bildschirm im Hintergrund löschen
    dbg.setColor (getBackground ());
    dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

    // Auf gelöschten Hintergrund Vordergrund zeichnen
    dbg.setColor (getForeground());
    paint (dbg);

    // Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
    g.drawImage (dbImage, 0, 0, this);
  }
  
  public void mouseClicked (MouseEvent e){}
  public void mouseEntered (MouseEvent e){}
  public void mouseExited (MouseEvent e){}
  public void mousePressed (MouseEvent e){}
  public void mouseReleased (MouseEvent e){}
}
 
kommt das nächste problem. wenn ich auf den button klicke dann soll im applet das spiel weiter (Spiel starten) geführt werden. Wie wäre das am besten zu lösen?
 
Du könntest ganz einfach eine neue Seite laden lassen mit dem Spiel-Applet darin.
Ansonsten müsstest du die Appletfläche löschen und dann das Spiel darauf zeichnen.
 
kann man nicht das alte applet schließen ohne das browser fenster schließen zu müssen und ein neues applet in dem fenster laden. bitte die methode dafür posten wenns geht. danke im vorraus.
 
Um diesen Thread noch abzuschließen:
Java:
getAppletContext().showDocument(new URL(url), "_self");
getAppletContext() besorgt den AppletContext, auf dem dessen Methode showDocument() die Webseite mit dem Applet ins gleiche Browser-Fenster läd.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben