MouseListener für ein eingefügtes Bild in einem JFrame

hsw

Mitglied
hallo java-forum!

ich habe in meinem jframe in bild eingefügt. das hat alles super funktioniert.
jetzt möchte ich, wenn ich NUR auf das bild klicke, dass sich die hintergrundfarbe vom frame ändert.
wenn ich momentan irgendwo im frame zweimal klicke, ändert sich die hintergrundfarbe.. ???:L

ich hoffe auf hilfreiche antworten! 🙂


MAIN:
Java:
package zzzz;

import javax.swing.JFrame;

public class Main
{
		public static void main(String[] args)
		{
			JFrame frame= new JFrame();
			frame.setSize(500,500);
						
			Bild bild=new Bild();
			bild.addMouseListener(new MouseHandler(frame));
			
			frame.add(bild);
				
			frame.setVisible(true);	
		}	
}

klasse zum bild einfügen:
Java:
package zzzz;

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Bild extends JPanel
{
	
	public void paintComponent(Graphics g)
	{
		Image bild=new ImageIcon("asdf.jpg").getImage();
		g.drawImage(bild,4,4,this);
				
		
		
	}
	
}

klasse mousehandler:
Java:
package zzzz;

import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;

public class MouseHandler implements MouseMotionListener,  MouseListener
{
	
	private JFrame frame;
	
	public MouseHandler(JFrame asdf)
	{
	           frame=asdf;
	}
	
		
	@Override
	public void mouseClicked(MouseEvent event)
	{
		frame.setBackground(Color.cyan);
	}
}
 
Grundsätzlich ist es eine schlechte Idee in der paintComponent des Bildpanels jedesmal das Bild neu zu laden. Ausser es ändert sich andauernd und selbst dann sollte man es nicht in der Methode laden.
Man könnte z.B. im Bildpanel eine zusätzliche Methode implementieren, welche die Position des MouseEvents mit der Position des Bildes und dessen Ausdehnung vergleicht und dementsprechen true oder false zurück gibt.
 
Ich vermute, dass das Bild-Panel größer ist, als von Dir gedacht und es deswegen die Klick-Events empfängt, die es eigentlich nicht mehr empfangen sollte. Mach mal die Hintergrundfarbe deines Bild-Panels testweise anders als die vom JFRame, dann siehst Du es.
 
Ich vermute, dass das Bild-Panel größer ist, als von Dir gedacht und es deswegen die Klick-Events empfängt, die es eigentlich nicht mehr empfangen sollte. Mach mal die Hintergrundfarbe deines Bild-Panels testweise anders als die vom JFRame, dann siehst Du es.

ok! kannst du mir bitte sagen, wie ich die hintergrundfarbe vom bild-panel ändern kann?
 
setBackground(Color....)
Falls es Dir nicht bewusst ist, das JPanel mit dem MouseListener nimmt den gesamten Platz ein.

Ausserdem solltest Du in der überschriebenen paintComponent zuerst
Code:
super.paintComponent(g)
aufrufen.
 
mir sind die funktionen vom jpanel noch nicht ganz klar. habe vorher immer nur mit awt-frames gearbeitet.
also kann mein code nicht funktionieren, weil das jpanel vom bild über den ganzen frame geht?

welche alternativen befehle für bilder kann ich nutzen, damit das funktioniert?
 
int mouseX = (int)event.getPoint().getX();
int mouseY =(int) event.getPoint().getY();

then check, ob (mouseX , mouseY) in dem bild ist.
 
welche alternativen befehle für bilder kann ich nutzen, damit das funktioniert?
Wenn Du mit Bildern arbeitest, bleibt Dir fast nichts anderes übrig als die Mausposition manuell mit der der Position des Bildes zu vergleichen. Ausser Du sorgst dafür, dass das JPanel genauso groß wie das Bild ist, was sich je nach LayoutManager nicht unbedingt einfach und möglich ist.
Ersteres ist ja nur ein simpler Vergleich von Koordinaten z.B. xBild <= xMaus <= xBild +breiteBild und yBild...
Man könnte sich Position und Ausdehnung aus als Rectangle speichern, Rectangle bietet die Methode contains(Point)
 

Zurück
Oben