Möglichkeit mit Listerners die Farbe meiner Objekte zu ändern

Zidinjo

Mitglied
Hallo liebe Community,

ich bin grade dabei ein wenig zu programmieren und nun stehe ich irgendwie vor einem Problem. Ich kann dieses Problem irgendwie nicht lösen, vielleicht weiß ein erfahrenderer programmiere dort abhilfe.

Meine Klasse von der ich erbe :

Java:
package de.marvin.oopLabor3;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class GeometricObject extends JPanel implements MouseListener, MouseMotionListener
{
	private static final long serialVersionUID = 1L;
	private int fensterGroesse = 600;
	private int randomAuswahl;
	private int gridX = 8;
	private int gridY = 8;
	private final int MAXRANDOM = 5;
	private final int MINRANDOM = 1;
	private final int MAXCOLOR = 240;
	private final int RedBorderSize = 40;
		
	public  void felderErstellung()
	{
		JFrame f = new JFrame("Laboraufgabe 3");
		f.setSize(fensterGroesse,fensterGroesse);
		f.setLocationRelativeTo(null);
		f.setLayout(new GridLayout(gridX,gridY));
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setResizable(false);
			
		for(int i = 0; i < (gridX*gridY);i++)
		{
			randomAuswahl = randInt(MINRANDOM,MAXRANDOM);
			switch(randomAuswahl)
			{
				case 1:
					f.add(new Square());
					break;
				case 2:
					f.add(new Circle());
					break;
				case 3:
					f.add(new Triangle());
					break;
				case 4:
					f.add(new Pacman());
					break;
				case 5:
					f.add(new MySpecialShape());
					break;
			}
		}
		f.setVisible(true);
	}
	
	protected int randInt(int min, int max) 
	{
	    Random rand = new Random();
	    int randomNum = rand.nextInt((max - min) + 1) + min;

	    return randomNum;
	}
	
	protected  int[] setRelativeSize()
	{
		int FillViereck = randInt(MINRANDOM,MAXRANDOM); //Muss gleiche größe haben, deshalb eine Variable
	
        final Dimension dBorder = getSize();  // Bekomme die höhe und weite als Dimension Object back
        final Dimension dFill = new Dimension(dBorder.width /FillViereck, dBorder.height /FillViereck); // Erstelle selbst ein neues Object
        final Point p0Fill = new Point((dBorder.width - dFill.width) / 2,(dBorder.height - dFill.height) / 2); // X u Y Wert
        int[] koordinaten = {p0Fill.x,p0Fill.y, dFill.width, dFill.height};

        return koordinaten;
	}
	
	protected void kastenErstellen(Graphics g)
	{
		g.setColor(Color.RED); //Vorgegeben
		g.drawRect(getWidth()/RedBorderSize,getHeight()/RedBorderSize,getWidth()-2,getHeight()-2); // Sonst sind die L
	}
	
	protected void setColor(Graphics g)
	{
		g.setColor(new Color(randInt(MINRANDOM,MAXCOLOR),randInt(MINRANDOM,MAXCOLOR),randInt(MINRANDOM,MAXCOLOR)));
	}
	
	public void mouseClicked(MouseEvent event)
	{
		System.out.println("hello");
	}
	
	public void mousePressed(MouseEvent event)
	{
		System.out.println("hello");
	}
	
	public void mouseReleased(MouseEvent event)
	{
		
	}
	
	public void mouseEntered(MouseEvent event)
	{
		
	}
	
	public void mouseExited(MouseEvent event)
	{
		
	}
	
	//These are mousemoition
	
	public void mouseDragged(MouseEvent event)
	{
		
		
	}
	
	public void mouseMoved(MouseEvent event)
	{
		System.out.println("eigentlich rot");
	}

}

Z.b Square die Farbe ändern.

Java:
package de.marvin.oopLabor3;

import java.awt.Graphics;

public class Square extends GeometricObject
{
	private static final long serialVersionUID = 1L;
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		int[] koordinaten = setRelativeSize();
		
		setColor(g);
		g.fillRect(koordinaten[0], koordinaten[1], koordinaten[2],koordinaten[3]);

		addMouseMotionListener(new GeometricObject());
		kastenErstellen(g);
	}
}

Weiß jemand wie ich in der Methode

Java:
	public void mouseMoved(MouseEvent event)
	{
		System.out.println("eigentlich rot");
	}

mein Objekt von Typ Square die Farbe ändern kann ? Ich kann ja nicht eine neue Instanz der Klasse Square erstellen und dort dann den Datentyp Graphics übergeben und dann die Farbe ändern, weil er sonst ja tausende machen würde.

Mit freundlichen Grüßen

Zidi
 
Du speicherst die Farbe nicht im Graphics Objekt sondern in einer Variable vom Typ Color in der Klasse Square.
Dann überschreibst du setColor, setzt dabei die Variable und benutzt diese in paintComponent.
 
Ja, aber wie kann ich den darauf vom

Java:
public void mouseMoved(MouseEvent event)
	{
		
	}

zugreifen? Geht ja noch immer nicht 😀
 
Jetzt sehe ich das.
Dann machst du GeometricObject abstract und lässt die mouseMoved Methoden von den Subklassen implementieren. Im Konstruktor rufst du super.addMouseListener(this) auf.
 
Sorry aber habe noch nicht so viel Erfahrung mit den Listeners. Habe alles gemacht was du gesagt hast, aber wie kann ich die Farbe den ändern ? Irgendwie muss ich doch was übergeben, damit in der mehtode mein Objekt die Farbe wechselt^^
 
Du hast abstract GeometricObject extends JPanel implements MouseListener.
Dann hast du noch Square extends GeometricObject.
In Square implementierst du mouseMoved. In mouseMoved rufst du g.setColor(FARBE) auf. In paintComponent belegst du eine Klassenvariable Graphics g mit dem Graphics Objekt aus paintComponent mit this.g = g;
 
Dies hatte ich mir auch gedacht, Überschreibt er nicht die Farbe? weil sich nichts rührt 😀

Java:
package de.marvin.oopLabor3;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;

public class Square extends GeometricObject
{
	private static final long serialVersionUID = 1L;
	Graphics g;
	
	public Square()
	{
		super.addMouseMotionListener(this);
	}

	@Override
	void specialPaint(Graphics g, int StartX, int StartY, int size1, int size2) 
	{
		this.g = g;
		setColor(g);
		g.fillRect(StartX, StartY, size1, size2);
		kastenErstellen(g);
	}
	
	@Override
	public void mouseMoved(MouseEvent event)
	{
		g.setColor(Color.blue);
	}
}
 
Danke Gucky, klappt jetzt. Kurze Frage ist das normal, das die Farbe sich sehr schnell ändert ? Könnte man das auch einstellen, dass sich die Farbe nur 1 mal ändert wenn man rüberfährt ?
 
Kannst du es dir vorstellen, kannst du es auch programmieren aber ich verstehe nicht ganz, was du meinst.
Du könntest statt MouseMoved MousEntered überschreiben.
 
Gucky 😀 bist echt eine Maschine. Das nächste Problem folgt zugleich. Nun möchte ich die Größe meiner Objekte ändern. Wenn ich dies tu, dann bleiben die "älteren" gezeichneten Objekte im Jpanel drine. Kann man dies irgendwie clearen ? Habe schon gegoogelt aber remove usw hilft nichts.
 

Neue Themen


Zurück
Oben