Maus über bestimmten Bereich Hint o.ä. anzeigen lassen

Guten Tag,
und zwar würde ich gerne ein Bild in meine Form laden,
sobald die Maus über einen bestimmten Bereich im Bild ist soll mir das Programm einen bestimmten Hint einzeigen, der sich auch zur Laufzeit ändert.
Inwieweit kann ich dies umsetzen?
Das Bild in Form laden habe ich bereits, es geht mir hier hauptsächlich darum, wie das Programm in einem bestimmten Bereich einen Hint anzeigt, oder ähnliches.

Würde mich über Unterstützung freuen.

Sprichst du von Javascript? Oder was genau meinst du mit der „Form“?

Ich ergänze kurz noch meine Frage:

Außerdem soll das Programm auch wahrnehmen wenn ich in dem bestimmten Bereich 2 mal klicke beispielsweise.

Ich spreche hier von Java.
JFrame.

Tooltip ist das Stichwort, nach dem du suchen solltest.

Und dieses Tooltip kann ich nicht nur auf Objekte anwenden, sondern auch auf bestimmte Bereiche?
Und wenn ja wie geht sowas?
Weil ich bis jetzt tooltips nur beispielsweise auf Buttons angewandt habe.
Oder muss man hier bisschen tricksen und erstellt da ein Panel was eventuell visible false ist und man benutzt dann das als Objekt?

Was sind das den für Objekte Bereiche, bei denen du einen Tooltip haben möchtest? Sind das schon UI-Objekte?
Ansonsten könntest du dir auch etwas eigenes schreiben (MouseListener und wenn der an Position X (bzw grenze links<x<grenze rechts && grenze oben<y<grenze unten) ist, dann einen Tootltip mit Inhalt Y anzeigen)

http://docs.oracle.com/javase/tutorial/uiswing/components/tooltip.html

Und für die Doppelklicks gibt’s [JAPI]MouseListener[/JAPI] bzw. seine leere Default-Implementiereung [JAPI]MouseAdapter[/JAPI], wenn man nicht alle Methoden braucht.

bye
TT

@TheUnregistered :

Es ist ein Panel was in ein JFrame geladen wird worauf ein Bild abgelegt ist.
Und von dort aus möchte ich bei bestimmten Bereichen im Bild eine Tooltip nachricht erhalten, welche ich auch zur Laufzeit ändert.

Somit sind es also keine eigenständigen UI-Elemente bei denen man schon die vorhandenen Tooltips wie schon vorgeschlagen verwenden kannst.

Schau dir mal den MouseMotionListener an, der kann dir da weiterhelfen.

Gut habe mich mal daran versucht, leider funktioniert es nicht, er spuckt mir hierbei Fehlermeldungen aus:
(Habe erst mal nur die Abfrage geschrieben, welche Position die Maus auf dem Fenster hat)

import javax.imageio.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.event.MouseMotionListener;

 
public class PicturePanel extends JPanel { 
  private Image background;
  
  
  JPanel PicturePanel;
  
  
  PicturePanel.addMouseMotionListener(new MouseMotionListener(){
    public void mouseDragged(MouseEvent event){
      
    }
    
    public void mouseMoved(MouseEvent event){
      System.out.println("Position auf dem Fenster:");
      System.out.println("Xrel:"+event.getX() + " Yrel: " + event.getY());
    }
  });
  
  public PicturePanel() {
    super(new GridBagLayout());
    
    try {   
      background = ImageIO.read(getClass().getResource("background.png"));
    }
    catch(IllegalArgumentException iae) {
      JOptionPane.showMessageDialog(this, "Grafikdatei nicht gefunden!
"+iae.getMessage()); 
      System.exit(-1);
    }
    catch(IOException ioe) {
      JOptionPane.showMessageDialog(this, "Fehler beim Einlesen einer Grafikdatei!
"+ioe.getMessage());
      System.exit(-1);
    }
    
  }
  
  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if(background != null) { 
      g.drawImage(background, 0, 20, this);
    }
  }
  
  
  
  
  
}```

Grundsätzlich Fehlermeldungen immer hier mit angeben, da man daraus schon einiges erkennen kann…

Compiliere C:\Users\BeBoP\Pictures\Praktikant\Schaltplan-2014-02-11\Schaltplan\PicturePanel.java mit Java-Compiler
PicturePanel.java:16:38: error: <identifier> expected
  PicturePanel.addMouseMotionListener(new MouseMotionListener(){
                                     ^
PicturePanel.java:16:39: error: illegal start of type
  PicturePanel.addMouseMotionListener(new MouseMotionListener(){
                                      ^
PicturePanel.java:16:42: error: ')' expected
  PicturePanel.addMouseMotionListener(new MouseMotionListener(){
                                         ^
PicturePanel.java:16:62: error: ';' expected
  PicturePanel.addMouseMotionListener(new MouseMotionListener(){
                                                             ^
PicturePanel.java:16:63: error: illegal start of type
  PicturePanel.addMouseMotionListener(new MouseMotionListener(){
                                                              ^
PicturePanel.java:16:64: error: <identifier> expected
  PicturePanel.addMouseMotionListener(new MouseMotionListener(){
                                                               ^
PicturePanel.java:16:65: error: ';' expected
  PicturePanel.addMouseMotionListener(new MouseMotionListener(){
                                                                ^
PicturePanel.java:25:4: error: class, interface, or enum expected
  });
   ^
PicturePanel.java:27:10: error: class, interface, or enum expected
  public PicturePanel() {
         ^
PicturePanel.java:30:5: error: class, interface, or enum expected
    try {  
    ^
PicturePanel.java:32:5: error: class, interface, or enum expected
    }
    ^
PicturePanel.java:35:7: error: class, interface, or enum expected
      System.exit(-1);
      ^
PicturePanel.java:36:5: error: class, interface, or enum expected
    }
    ^
PicturePanel.java:39:7: error: class, interface, or enum expected
      System.exit(-1);
      ^
PicturePanel.java:40:5: error: class, interface, or enum expected
    }
    ^
PicturePanel.java:45:13: error: class, interface, or enum expected
  protected void paintComponent(Graphics g) {
            ^
PicturePanel.java:47:5: error: class, interface, or enum expected
    if(background != null) {
    ^
PicturePanel.java:49:5: error: class, interface, or enum expected
    }
    ^
18 errors

Versuche es mal so:

import javax.imageio.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.event.*;
 

public class PicturePanel extends JPanel { 
  private Image background;
  
  public PicturePanel() {
    super(new GridBagLayout());    

    try {   
      background = ImageIO.read(getClass().getResource("background.png"));
    }
    catch(IllegalArgumentException iae) {
      JOptionPane.showMessageDialog(this, "Grafikdatei nicht gefunden!
"+iae.getMessage()); 
      System.exit(-1);
    }
    catch(IOException ioe) {
      JOptionPane.showMessageDialog(this, "Fehler beim Einlesen einer Grafikdatei!
"+ioe.getMessage());
      System.exit(-1);
    }    

    addMouseMotionListener(new MouseMotionListener(){
        public void mouseDragged(MouseEvent event){
 

        }

    
        public void mouseMoved(MouseEvent event){
            System.out.println("Position auf dem Fenster:");
            System.out.println("Xrel:"+event.getX() + " Yrel: " + event.getY());
        }
     });

  }
  

  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if(background != null) { 
      g.drawImage(background, 0, 20, this);
    }
  } 

} ```

Die Einbindung der Events für eine Komponente erfolgt immer in ihrem Konstruktor.

Ja ohne Fehlermeldung ist das helfen schwer, aber was komisch aussieht, ist das du in deiner Klasse PicturePanel welche ja von JPanel erbt noch ein weiteres JPanel hast, was auch wieder PicturePanel heißt (und zwar auch großgeschrieben wie die Klasse)

Dann sollte PicturePanel.addMouseMotionListener(…) in einer Funktion stehen (z.B. deinem Konstruktor) und nicht einfach nur so in der Klasse

*** Edit ***
Da war ich wohl zu langsam

Perfekt, funktioniert einwandfrei, dann versuch ich mal das mit dem Bereichen und werde mich sicherlich hier noch mal melden :).

*** Edit ***

Also das mit den Bereichen funktioniert schon mal, er gibt mir korrekt die Korrdinaten aus, wenn ich den Bereich betrete und hört auf wenn ich den Bereich verlasse.
Ich habe mich mal dran versucht, das er beim Klicken in dem Bereich eine Aktion ausführt, leider führt erst gar nicht das Event aus, selbst wenn ich den Bereich nicht gewählt habe, was mache ich falsch? - Fehlermeldungen kommen nicht.

    import javax.imageio.*;
    import java.awt.*;
    import java.net.*;
    import java.io.*;
    import java.awt.event.*;
     
     
public class PicturePanel extends JPanel {
  private Image background;
  
  int xpos, ypos;
  
  public PicturePanel() {
    super(new GridBagLayout());
    
    
    
    try {  
      background = ImageIO.read(getClass().getResource("background.png"));
    }
    catch(IllegalArgumentException iae) {
      JOptionPane.showMessageDialog(this, "Grafikdatei nicht gefunden!
"+iae.getMessage());
      System.exit(-1);
    }
    
    catch(IOException ioe) {
      JOptionPane.showMessageDialog(this, "Fehler beim Einlesen einer Grafikdatei!
"+ioe.getMessage());
      System.exit(-1);
    }    
    addMouseMotionListener(new MouseMotionListener(){
      public void mouseDragged(MouseEvent event){
        
        
        
      }
      
      public void mousePressed(MouseEvent event){
        
        xpos = event.getX();
        ypos = event.getY();
        
        if ((xpos >= 160)  && (xpos <= 180) && (ypos >= 100) && (ypos <= 140))    
        {
          System.out.println("Geklickt");
        }
        else
        {
          System.out.println("Bereich nicht getroffen!");
        }
        
      }
      
      public void mouseMoved(MouseEvent event){
        xpos = event.getX();
        ypos = event.getY();
        
        if ((xpos >= 160)  && (xpos <= 180) && (ypos >= 100) && (ypos <= 140)) 
        {
          System.out.println(xpos + " " + ypos);
        }
        
        
        
      } 
    });
    
  }
  
  
  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if(background != null) {
      g.drawImage(background, 0, 20, this);
    }
  }
  
}

für das Clicken brauchst du einen anderen Listener, der MouseMotionListener ist, wie der Name schon andeuten lässt für Bewegung zuständig. Schau dir für das Pressen mal den hier an MouseListener

mousePressed() ist eine Methode aus [japi]MouseListener[/japi], also nicht aus [japi]MouseMotionListener[/japi].
Du musst also das Panel noch an einem MouseListener registrieren, so, wie du es bereits mit dem MouseMotionListener gemacht hast.

Die leere Default-Implementierung [JAPI]MouseAdapter[/JAPI] implementiert alle Mouse*Listener interfaces…

bye
TT

Habe das nun so gelöst, kann ich das irgendwie verbessern?

    import javax.imageio.*;
    import java.awt.*;
    import java.net.*;
    import java.io.*;
    import java.awt.event.*;
    import java.awt.event.MouseAdapter;


     
     
public class PicturePanel extends JPanel  {
  private Image background;
  
  int xpos, ypos;
  
  public PicturePanel() {
    super(new GridBagLayout());
    
    
    try {  
      background = ImageIO.read(getClass().getResource("background.png"));
    }
    catch(IllegalArgumentException iae) {
      JOptionPane.showMessageDialog(this, "Grafikdatei nicht gefunden!
"+iae.getMessage());
      System.exit(-1);
    }
    
    catch(IOException ioe) {
      JOptionPane.showMessageDialog(this, "Fehler beim Einlesen einer Grafikdatei!
"+ioe.getMessage());
      System.exit(-1);
    }    
    
    
    addMouseListener(new MouseAdapter()
    {  
      
      public void mousePressed(MouseEvent event){
        
        xpos = event.getX();
        ypos = event.getY();
        
        if ((xpos >= 160)  && (xpos <= 180) && (ypos >= 100) && (ypos <= 140))    
        {
          System.out.println("Geklickt");
        }
        else
        {
          System.out.println("Test");
        }
        
      }
    });
    
    addMouseMotionListener(new MouseMotionAdapter()
    {
      public void mouseMoved(MouseEvent event){
        xpos = event.getX();
        ypos = event.getY();
        
        if ((xpos >= 160)  && (xpos <= 180) && (ypos >= 100) && (ypos <= 140)) 
        {
          System.out.println(xpos + " " + ypos);
        }
        
        
      } 
    });
    
    
    
  }
  
  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if(background != null) {
      g.drawImage(background, 0, 20, this);
      
    }
  }
  
}