image und mouseListener

Status
Nicht offen für weitere Antworten.

Oni

Top Contributor
servus,

ich möchte ein ganz billiges mohrhuhn spiel machen. eigentlich um bisschen MVC zu testen.
jetzt habe ich das problem das ich wissen möchte, ob der benutzer mit dem cursor über dem bild war beim clicken oder nicht.

ich male das image mit drawImage auf den bildschirm.

leider kann ich dem image ja keinen mouselistener zuweisen oder ?. bleibt mir nur das berechnen(mit zwei if-abfragen die koords vergleichen) ob der benutzer über dem bild war oder gibt es da eine fertige lösung?
 

The_S

Top Contributor
Ich fürchte nein, hab vor kurzem auch ein ähnliches Problem gehabt und musste dann mich mit dem Abfragen der x y Koordinaten begnügen
 

Oni

Top Contributor
war das schnell genug ? oder gabs bei deinen abfragen dann verzögerungen und wurde ungenau?
 

The_S

Top Contributor
Ich habs nur für ne Bildergallerie verwendet (also nix, was sich bewegt) und für die hats gereicht. Aber für was, was sich bewegt ... kA. Könnte ma schauen, ob ich den Code noch da hab, dann würd ich ma kurz ne bewegende Bildergallerie draus machen um zu schauen, ob des funzt :wink:

[edit] nö, habs leider nicht auf Arbeit
 

Oni

Top Contributor
es funzt allerdings nicht 100%ig, wenn gerade der thread.sleep ist funzt es nicht.
 

Oni

Top Contributor
naja ich starte einen thread, der bewegt dann das bild über den bildschirm. damit sich das bild nicht zu schnell bewegt, habe ich in dem thread einen thread.sleep. und manchmal kommt es halt vor das man auf das bild klickt(schiesst) und nichts passiert. und ich denke, dass der eine thread dann gerade schläft und nicht auf das ereigniss reagieren kann.
aber das ist nicht so wichtig, mir geht es mehr um das MVC, ich bin mir unsicher, ob ich das alles so richtig mache. ich denke eher nicht.
 

The_S

Top Contributor
Dann speichere die Mausklicks hab, und führe sie aus, wenn der Thread geweckt wurde.

Post halt ma, wie du dir das mit MVC gedacht hast. Ich kenn mich damit zwar net aus, aber andere hier bestimmt :wink:
 

Sky

Top Contributor
Leg dein Bild auf eine von JComponent abgeleitete Klasse und lass dieses von deinem Thread bewegen. Zusätzlich bekommt deine Klasse einen Mouselistener und fertig ;)
 

The_S

Top Contributor
Hey, warum hat das mir keiner bei meiner Bildergallerie damals gesagt? :x :wink: . Naja, jetzt isses auch egal :)
 

Oni

Top Contributor
funktioniert das mit der JComponent besser ? hast das schon mal probiert?

ich poste mal den code, aber seid nicht zu streng mit mir bin noch anfänger :wink:

Controller
Code:
/**
 *
 * Klasse zur Steuerung der Hühner
 *
 */
public class MohrhuhnController
{
	String richtung = "";
     int x = 0;
     int y = 0;

     MohrhuhnController()
     {
     }

     /**
      *
      * Legt die Startposition fest
      *
      */
     public void setStartWert(MohrhuhnModel huhnModel)
     {
        	x =(int)(Math.random()* 10);
          if(x > 5)
          {
          	richtung = "rechts";
          	x = 475;
          }
          else
          {
          	richtung = "links";
          	x = -5;
          }

          y = 0;
          while(( y == 0) || (y > 360))
          {
          	y = (int) ((Math.random() * 10) * 30);
          	System.out.println("y: " + y);
          }
          huhnModel.setX(x);
          huhnModel.setY(y);
          huhnModel.setRichtung(richtung);
     }

     /**
      *
      * Bewegt das Huhn über den Bildschirm
      *
      */
     public void move(MohrhuhnModel huhnModel, int x)
     {
          y = huhnModel.getY();
          int z = (int)(Math.random() * 10);
          if(z > 5)
          {
          	if(y > 350)
               {
               	y = y - (int)((Math.random() * 10) + (Math.random() * 5));
               }
               else
               {
          		y = y + (int)((Math.random() * 10) + (Math.random() * 5));
               }
          }
          else
          {
          	if(y < 35)
               {
	               y = y + (int)((Math.random() * 10) + (Math.random() * 5));
               }
               else
               {
          		y = y - (int)((Math.random() * 10) + (Math.random() * 5));
               }
          }
          huhnModel.setY(y);
          huhnModel.setX(x);
     }

     /**
      *
      * Main
      *
      */
     public static void main(String[] args)
     {
     	new MohrhuhnView();
     }
}

Viewer (2Klassen)
Code:
import javax.swing.*;
import java.awt.*;
import java.io.*;
import javax.imageio.*;

public class MohrhuhnPaint extends JComponent
{
	private Image bg;
     private Image huhn;
     private MohrhuhnModel huhnModel;
     private MohrhuhnController controller;
     private boolean gestartet = false;
     private boolean isInterrupted = false;

	MohrhuhnPaint()
     {
     	File bild = new File("image/bg.jpg");
          File bild2 = new File("image/huhn.gif");
          try
          {
          	bg = ImageIO.read(bild);
               huhn = ImageIO.read(bild2);
          }
          catch(IOException ioe)
          {
          	ioe.printStackTrace();
          }
     }

     public void start(MohrhuhnModel huhnModel)
     {
     	this.huhnModel = huhnModel;
          controller = new MohrhuhnController();
          controller.setStartWert(huhnModel);
          gestartet = true;
          repaint();
     }

     public void run()
     {
     	String richtung = huhnModel.getRichtung();
          int x = huhnModel.getX();
          int y = huhnModel.getY();

          if(richtung.equals("links"))
          {
     		while((x < 510) && (!huhnModel.getGetroffen()))
               {
     			controller.move(huhnModel, x);
               	x = x + 2;
                    try
                    {
                    	Thread.sleep(50);
                    }
                    catch(InterruptedException ie)
                    {
                    	ie.printStackTrace();
                    }
                    repaint();
               }
          }
          else if(richtung.equals("rechts"))
          {
     		while((x > -30) && (!huhnModel.getGetroffen()))
               {
     			controller.move(huhnModel, x);
               	x = x - 2;
                    try
                    {
                    	Thread.sleep(50);
                    }
                    catch(InterruptedException ie)
                    {
                    	ie.printStackTrace();
                    }
                    repaint();
               }
          }
     }


	public void paintComponent(Graphics g)
     {   
     	g.drawImage(bg, 0, 0, 500, 330, this);
          if(gestartet)
          {
          	if(!huhnModel.getGetroffen())
          	{
          		g.drawImage(huhn,huhnModel.getX(), huhnModel.getY(), this);
               }
          }
          if((gestartet) && (huhnModel.getGetroffen()))
          {
          	g.setColor(Color.blue);
               g.setFont(new Font("Serif",Font.BOLD, 50));
          	g.drawString("Treffer", 100, 100);
          }
     }
}

// ########## und ############

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


public class MohrhuhnView extends JFrame implements ActionListener, MouseListener, Runnable
{
     private JMenuItem neu;
     private JMenuItem schliessen;
     private MohrhuhnPaint zeichnen;
     MohrhuhnModel huhnModel;

	MohrhuhnView()
     {
          setTitle("Mohrhun");
          setPreferredSize(new Dimension(500,375));
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          JMenuBar bar = new JMenuBar();
          bar.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
          setJMenuBar(bar);
          JMenu menu = new JMenu("Game");
          bar.add(menu);
          neu = new JMenuItem("Neues Game");
          neu.addActionListener(this);
          neu.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
          menu.add(neu);
          menu.addSeparator();
          schliessen = new JMenuItem("Schliessen");
          schliessen.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
          menu.add(schliessen);

          zeichnen = new MohrhuhnPaint();
          zeichnen.addMouseListener(this);

          setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
          add(zeichnen);

     	pack();
          setVisible(true);
     }

     // ActionEvent
     public void actionPerformed(ActionEvent e)
     {
     	if(e.getSource().equals(neu))
          {
          	huhnModel = new MohrhuhnModel();
               zeichnen.start(huhnModel);
               new Thread(this).start();
          }
     }
     // MouseEvent's
     public void mouseClicked(MouseEvent e)
     {
     	System.out.println(true);
          int mouseX = e.getX();
          int mouseY = e.getY();
          int x = huhnModel.getX();
          int y = huhnModel.getY();

          if((mouseX >= x) && (mouseX <= (x + 25)))
          {
          	if((mouseY >= y) && (mouseY <= (y + 25)))
               {
               	huhnModel.setGetroffen(true);
               }
          }
     }
     public void mousePressed(MouseEvent e)
     {
     }
     public void mouseReleased(MouseEvent e)
     {
     }
     public void mouseEntered(MouseEvent e)
     {
     }
     public void mouseExited(MouseEvent e)
     {
     } 
     public void run()
     {
     	zeichnen.run();
     }
}

und das Model

Code:
public class MohrhuhnModel
{
     int x = 0;
     int y = 0;
     String richtung = "rechts";
     boolean getroffen = false;

     // x position
     public void setX(int x)
     {
     	this.x = x;
     }
     public int getX()
     {
     	return x;
     }

     // y position
     public void setY(int y)
     {
     	this.y = y;
     }
     public int getY()
     {
     	return y;
     }

     // flug richtung
     public void setRichtung(String richtung)
     {
     	this.richtung = richtung;
     }
     public String getRichtung()
     {
     	return richtung;
     }

     // getroffen
     public void setGetroffen(boolean getroffen)
     {
     	this.getroffen = getroffen;
     }
     public Boolean getGetroffen()
     {
     	return getroffen;
     }
}
 

Sky

Top Contributor
Ich habe mir mal eine eigene Klasse für eine Laufschrift gemacht, das ging ganz gut:
Code:
 class LaufSchrift extends JComponent {
    private BufferedImage image = null;

    public LaufSchrift( BufferedImage image, final AbstractAction action ) {
      this.image = image;
      this.setSize(image.getWidth(), image.getHeight());
      this.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
          action.actionPerformed(new ActionEvent(e.getSource(), e.getID(), "LaufschriftClicked", e.getWhen(), e.getModifiers()));
        }
      });
    }

    public void paint( Graphics g ) {
      g.drawImage(image, this.getLocation().x, this.getLocation().y, image.getWidth(), image.getHeight(), null);
    }

  }
 

Oni

Top Contributor
danke :), ich probiere es mal umzusetzen.

und was hast du zum MVC zu sagen? was muss ich da noch ändern?
 

Oni

Top Contributor
hmm ich raff nicht ganz wie ich den code bei mir integrieren soll.

ich muss das ganze doch in einer extra klasse lassen oder?

dann erzeuge ich aus meinen jetztigen code eine instance der klasse und übergeben an den konstruktor eine image und einen listener(welchen ?) und wie wird das dann dargestellt? ich habe ja eine paintComponent-methode mit der ich das zeichne.
zumal ich ja die listener in einer anderen klasse habe als die paintcomponent.

oder liege ich damit falsch ?

ich steh da total auf dem schlauch...

kannst du mir das mal erläutern?
 

Sky

Top Contributor
Du darfst die Klasse nicht 1:1 übernehmen.

Das war ein Beispiel, wie man es über eine eigene Komponente regeln kann. In meinem Beispiel habe ich ein Bild übergeben und diese konnte ich per setLocation in seiner Position ändern. Der Vorteil daran war, dass man nicht die Koordinaten berechnen muss nach dem Klick, sondern das ein Klick immer zu einer Action führt, wenn das Bild geklickt wurde
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Area mit Teil-Image füllen Java Basics - Anfänger-Themen 0
B Image Matching in Memory Minigame Java Basics - Anfänger-Themen 7
J JLabel bzw. Image Icon mit KeyEvent bewgen Java Basics - Anfänger-Themen 9
Butzibu Image Loader lädt nicht alle Bilder: Java Basics - Anfänger-Themen 4
Schniffi Nur bestimmte Bilder aus einem Array auf Image Button anzeigen lassen Java Basics - Anfänger-Themen 3
T Image Icon Java Basics - Anfänger-Themen 3
K File (png) in Image laden Java Basics - Anfänger-Themen 3
M Image löschen Java Basics - Anfänger-Themen 2
G Image in Vordergrund Java Basics - Anfänger-Themen 3
B InputStream (PDF) nach Image (PNG / JPG) konvertieren? Java Basics - Anfänger-Themen 2
S Image Datei selektieren und in Projekt Verzeichnis abspeichern/kopieren Java Basics - Anfänger-Themen 16
N Best Practice Image recognition fuzzy Superhash berechnen Java Basics - Anfänger-Themen 1
H Image laden Java Basics - Anfänger-Themen 4
R Image drehen Java Basics - Anfänger-Themen 1
R Image Teilen Java Basics - Anfänger-Themen 3
B Image laden im GridBagLayout Java Basics - Anfänger-Themen 3
N Image von Resource wird nicht geladen Java Basics - Anfänger-Themen 2
N Datentypen Image zu Byte-Array Java Basics - Anfänger-Themen 4
F Image wird nicht gezeichent?! Java Basics - Anfänger-Themen 21
N Hintergrund image mit .setContentPane Java Basics - Anfänger-Themen 6
W aus Methode auf JLabel zugreifen und Image verändern Java Basics - Anfänger-Themen 1
S buffered image Java Basics - Anfänger-Themen 18
V Scale displayed Image via JCheckBox Java Basics - Anfänger-Themen 1
I Resize Image - Einlesen von InputStream Java Basics - Anfänger-Themen 3
M Image Download klappt nicht mehr Java Basics - Anfänger-Themen 4
Chava Testprojekt.Text.Image.Button Java Basics - Anfänger-Themen 4
S Image nach MausMotion rotieren Java Basics - Anfänger-Themen 7
L Erste Schritte Java Image und Video-Slideshow GUI Java Basics - Anfänger-Themen 3
D Kleinere Positionsangabe als einzelne Pixel bei Image? Java Basics - Anfänger-Themen 28
S Image in Panel laden Java Basics - Anfänger-Themen 12
H Prüfen, ob jpg image schon vorhanden ist, bevor es geladen wird Java Basics - Anfänger-Themen 13
V Image Crawler Java Basics - Anfänger-Themen 3
P Erste Schritte Buffered Image splitten und darstellen Java Basics - Anfänger-Themen 2
P Erste Schritte Image anzeigen in ausführbarer jar mit der Toolkit class Java Basics - Anfänger-Themen 8
T udp -> bytearray -> image -> ausgabe via frame Java Basics - Anfänger-Themen 6
A Image (Bitmap) in String (für XML) Java Basics - Anfänger-Themen 7
F Buffered Image über Socket versenden Java Basics - Anfänger-Themen 6
T Image ist Null - warum? Java Basics - Anfänger-Themen 18
V Image -> 2D Array (int [][]) Java Basics - Anfänger-Themen 4
L Image laden und auf jPanel ausgeben Java Basics - Anfänger-Themen 7
V FileInputStream auf ein swt.Image Java Basics - Anfänger-Themen 6
A Wie kann man etwas von Typ Image wieder löschen? Java Basics - Anfänger-Themen 7
F Image übertragen und zeichnen Java Basics - Anfänger-Themen 8
G Problem mit Image.IO.read( File ) Java Basics - Anfänger-Themen 3
G Image spiegeln Java Basics - Anfänger-Themen 17
Y Trotz add wird Image in GradBagLayout nicht angezeigt Java Basics - Anfänger-Themen 5
Spin Image helper Java Basics - Anfänger-Themen 6
M Image Metadaten setzen Java Basics - Anfänger-Themen 2
Spin Backgrond Color von Image ermitteln Java Basics - Anfänger-Themen 2
C Image draw... Java Basics - Anfänger-Themen 7
M Image-Icon Ändern Java Basics - Anfänger-Themen 15
J Image upload auf ImageShack,TinyPic usw. Java Basics - Anfänger-Themen 11
R Image laden die Zweite Java Basics - Anfänger-Themen 4
R Image laden Java Basics - Anfänger-Themen 10
M Image zeichenen mit Double Werten Java Basics - Anfänger-Themen 4
B polyline auf buffered image malen Java Basics - Anfänger-Themen 2
G Image to File Java Basics - Anfänger-Themen 4
T Image Position erkennen Java Basics - Anfänger-Themen 6
Spin Image skalieren Java Basics - Anfänger-Themen 2
Spin Background Image Java Basics - Anfänger-Themen 2
K Image / drawImage Java Basics - Anfänger-Themen 2
P Buffered Image, Bereich ausschneiden Java Basics - Anfänger-Themen 3
F Image Editor Java Basics - Anfänger-Themen 2
R Image aus jar laden (dieses mal awt) Java Basics - Anfänger-Themen 19
B Image flimmert Java Basics - Anfänger-Themen 4
Povlsen84 Image exakt erzeugen Java Basics - Anfänger-Themen 5
B Teile einer Image in neue Image kopieren Java Basics - Anfänger-Themen 4
X ARGB Werte auslesen aus Image Java Basics - Anfänger-Themen 2
O Image Loader laedt bild nicht Java Basics - Anfänger-Themen 11
H String to image! Java Basics - Anfänger-Themen 6
H2SO3- image beim awt frame wegmachen Java Basics - Anfänger-Themen 2
M Probleme mit Manifest und Image Java Basics - Anfänger-Themen 2
T Java Bilderverwaltung - Image Fetcher Problem Java Basics - Anfänger-Themen 4
E Image in Datei speichern bzw anzeigen Java Basics - Anfänger-Themen 5
G Image laden Java Basics - Anfänger-Themen 16
O Drag & Drop mit Image? Java Basics - Anfänger-Themen 2
G Image/-Icon wird nicht auf JPanel angezeigt Java Basics - Anfänger-Themen 4
M Image aus JPanel Java Basics - Anfänger-Themen 2
G Kompletten (image) Array löschen Java Basics - Anfänger-Themen 14
P Fileinputstream to image? Java Basics - Anfänger-Themen 3
G Image Problem Java Basics - Anfänger-Themen 5
G Image Java Basics - Anfänger-Themen 3
M draw.Image Java Basics - Anfänger-Themen 11
O Image laden Java Basics - Anfänger-Themen 6
G Image Java Basics - Anfänger-Themen 2
S Image-Datei mit relativem Pfad angeben Java Basics - Anfänger-Themen 3
S Botton und Image kombinieren Java Basics - Anfänger-Themen 3
S import javax.image.io.*; funktioniert nicht Java Basics - Anfänger-Themen 28
D Image drehen Java Basics - Anfänger-Themen 6
DeeDee0815 Uncaught error fetching image Java Basics - Anfänger-Themen 2
A Image erstellen Java Basics - Anfänger-Themen 3
N Grösse eines Image ändern? Java Basics - Anfänger-Themen 4
I Image Dateinformationen auslesen Java Basics - Anfänger-Themen 7
A image uploader applet Java Basics - Anfänger-Themen 10
S image speichern Java Basics - Anfänger-Themen 12
D ImageIO metadata auslesen aus png image Java Basics - Anfänger-Themen 2
G Ausmaße eines Image-Object herrausfinden Java Basics - Anfänger-Themen 4
R Einem Image-Object Alpha-Transparenz hinzufügen Java Basics - Anfänger-Themen 3
S Image in byte[] umwandeln? Java Basics - Anfänger-Themen 2
G Ein Image langsam einblenden und nach 5 Sekunden ausblenden? Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben