Zum Inhalt springen

Rechtecke, die sich nicht überdecken sollen


Empfohlene Beiträge

Geschrieben

Hallo,

ich wollte durch Mausklick Rechtecke zeichnen, die sich nicht überdecken sollen.(ein Rechteck soll nicht in einem anderen erscheinen) Das mit dem nicht überdecken geht nicht. Wenn ich es versuche, kommt durch list.size() ganz viele Rechtecke auf einmal in diesem Bereich (Auszug):

Kann mir da jemand helfen?

Bernd

public void mouseClicked(MouseEvent me) {






			//linke Maustaste?

			if(me.getButton()==1){

				//ist die Liste leer?

				if(list.size()==0) {

					z=me.getX();

					z2=me.getY();

					x1 = -50 + (int) (Math.random() * (width + 40));

					y1 = (int) (Math.random() * (height + 20));	

					Rechteck robj=new Rechteck( z, z2,  x1, y1);

					addRechteck((Rechteck) robj);


				}

				//else {



				//	if(list.size()<10)

					z=me.getX();

					z2=me.getY();

			//	mouseEntered(me,z,z2);	



					x1 = -50 + (int) (Math.random() * (width + 40));

					y1 = (int) (Math.random() * (height + 20));	

					Rechteck robj=new Rechteck( z, z2,  x1, y1); //Rechteckobjekt mit 4 Parametern erzeugen


				//for(int i=0; i<list.size(); i++){

					for(int i=0; i<list.size(); i++){	


				if(!(list.get(i).contains(robj))&&i<10){	//neues robj enthält keines vorhandenen Listen Rechtecke?

				mouseEntered(me, robj);

					//Rechteck robj=new Rechteck( z, z2,  x1, y1);

		//	if(i==list.size()-1){ //falls oben ja, dann bei Listenende nur ein Rechteck hinzufügen




					//addRechteck((Rechteck) robj);//nur ein neues Rechteck hinzufügen 

			}

				}


					//0}

			//}

				//}

				//}

				//}

				repaint();		//neuzeichnen 

		}

	/*	public void mouseEntered(MouseEvent me, Rechteck robj) {

		//	Rechteck robj=new Rechteck( z, z2,  x1, y1);

		addRechteck((Rechteck) robj);


			//addRechteck(z,z2);

			}*/

		}




		private void mouseEntered(MouseEvent me, Rechteck robj) {

			if(me.getID()!=MouseEvent.MOUSE_ENTERED){

				addRechteck((Rechteck) robj);

			}


		}

import java.awt.Image;

import java.awt.Toolkit;

import javax.swing.JFrame;


public class main_class {

	public static Image image;


	public static void main(String[] args) {

		JFrame window = new JFrame("Rechtecke");

		window.setSize(600, 600);

		window.setLocationRelativeTo(null);

		window.getContentPane().add(new Rechteck_Panel(window));

		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		//Icon in der oberen linken Ecke der Frame verändern


		window.setIconImage(image);

		window.setVisible(true);

	}

}


import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Point;

import java.awt.Rectangle;

import java.awt.event.InputEvent;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.MouseMotionAdapter;

import java.util.ArrayList;

import javax.swing.JDialog;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

@SuppressWarnings("serial")

public class Rechteck_Panel extends JPanel {

	private Graphics2D g2;					//2D Graphikobjekt

	//private Point mausposition;				//Mausposition

	private ArrayList<Rechteck> list;		//Liste für Rechtecke

private int x1;

private int y1;

private int z;

private int z2;

private int width;

private int height;

	private JDialog myDialog;


	//Konstruktor

	public Rechteck_Panel(JFrame window) {

		super();

		myDialog = new JDialog(window, "Fehler", true);

		myDialog.setBounds(new Rectangle(window.getLocation().x,window.getLocation().y,200,60));

		myDialog.add(new JLabel("Maus nicht im Fenster"));

		myDialog.setLayout(new FlowLayout(FlowLayout.CENTER));

		setBackground(Color.LIGHT_GRAY);

		list = new ArrayList<Rechteck>();

		//MouseListeners

		addMouseListener(new MyMouseListener());


		setFocusable(true);

		requestFocus();

	}


	protected void paintComponent(Graphics g) {

		g2 = (Graphics2D) g;

		super.paintComponent(g);

		//String zeichnen

		g.drawString("r=rot, b=blau, w=weiss, a=Alle schwarz", 

				10, getHeight()-10);

		//versuche Rechtecke zu zeichnen

		try {

			for(int i=0; i<list.size(); i++) {


				g2.draw(list.get(i));

				g2.setColor(Color.BLACK);

			}

		} catch(java.lang.NullPointerException e) {

			System.out.println("fehler");

		}

	}


	//Rechteck hinzufügen

	private void addRechteck(Rechteck robj) {//Übergabe der Mausposition in z und z2

		try {//mausposition ist ein Obj

			width = getSize().width; // Get width

			height = getSize().height; // and height



			//Rechteck robj=new Rechteck(30, 30,  x1, y1);

			//Rechteck robj2=new Rechteck(20, 90,  x1, y1);





			//for (int i=0; i<list.size(); i++){

				//if(list.get(i).contains(robj.x, robj.y)==false) {

				//}

			/*

if(list.size()==0){

			list.add(new Rechteck(robj.x, robj.y,

				(int)((robj.width) * Math.random()),

				(int)((getSize().height) * Math.random())));

}*/



	//	for(int i=0; i<=list.size(); i++){

	//			if(!list.get(i).contains(robj)){



				list.add(new Rechteck(robj.x, robj.y,

					(int)((robj.width) * Math.random()),

					(int)((getSize().height) * Math.random()))); //Rechteck der Rechteckliste hinzufügen

		//		}

		//}




			/*list.add(new Rechteck(mausposition.x, mausposition.y,

					(int)((getSize().width-mausposition.x) * Math.random()),

					(int)((getSize().height-mausposition.y) * Math.random())));

					*/

		} catch(java.lang.NullPointerException e) {

			System.out.println("fehler");

		}

	}




	//MouseListener Klasse

	class MyMouseListener extends MouseAdapter {

		public MyMouseListener() { }




		//wurde Maustaste geclickt

		public void mouseClicked(MouseEvent me) {






			//linke Maustaste?

			if(me.getButton()==1){

				//ist die Liste leer?

				if(list.size()==0) {

					z=me.getX();

					z2=me.getY();

					x1 = -50 + (int) (Math.random() * (width + 40));

					y1 = (int) (Math.random() * (height + 20));	

					Rechteck robj=new Rechteck( z, z2,  x1, y1);

					addRechteck((Rechteck) robj);


				}

				//else {



				//	if(list.size()<10)

					z=me.getX();

					z2=me.getY();

			//	mouseEntered(me,z,z2);	



					x1 = -50 + (int) (Math.random() * (width + 40));

					y1 = (int) (Math.random() * (height + 20));	

					Rechteck robj=new Rechteck( z, z2,  x1, y1); //Rechteckobjekt mit 4 Parametern erzeugen


				//for(int i=0; i<list.size(); i++){

					for(int i=0; i<list.size(); i++){	


				if(!(list.get(i).contains(robj))&&i<10){	//neues robj enthält keines vorhandenen Listen Rechtecke?

				mouseEntered(me, robj);

					//Rechteck robj=new Rechteck( z, z2,  x1, y1);

		//	if(i==list.size()-1){ //falls oben ja, dann bei Listenende nur ein Rechteck hinzufügen




					//addRechteck((Rechteck) robj);//nur ein neues Rechteck hinzufügen 

			}

				}


					//0}

			//}

				//}

				//}

				//}

				repaint();		//neuzeichnen 

		}

	/*	public void mouseEntered(MouseEvent me, Rechteck robj) {

		//	Rechteck robj=new Rechteck( z, z2,  x1, y1);

		addRechteck((Rechteck) robj);


			//addRechteck(z,z2);

			}*/

		}




		private void mouseEntered(MouseEvent me, Rechteck robj) {

			if(me.getID()!=MouseEvent.MOUSE_ENTERED){

				addRechteck((Rechteck) robj);

			}


		}

	}


}








import java.awt.Color;

import java.awt.Rectangle;


@SuppressWarnings("serial")

public class Rechteck extends Rectangle {

	private Color farbe;

	private int dx, dy;				//Abstände der Maus

	private boolean imRechteck;		//beim Verschieben


	public Rechteck(int x, int y, int width, int height) {

		super(x, y, width, height);

		this.farbe = Color.BLACK;

		//this.imRechteck=false;

	}

	/*

	public boolean isImRechteck() {

		return imRechteck;

	}


	public void setImRechteck(boolean imRechteck) {

		this.imRechteck = imRechteck;

	}

*/

	public Color getFarbe() {

		return farbe;

	}


	public void setFarbe(Color farbe) {

		this.farbe = farbe;

	}

/*

	public int getDx() {

		return dx;

	}


	public void setDx(int dx) {

		this.dx = dx;

	}


	public int getDy() {

		return dy;

	}


	public void setDy(int dy) {

		this.dy = dy;

	}

	*/

}

ProginsNetz.zip

Geschrieben

Ich sehe nicht so ganz das Problem, Du musst, bevor das neue Rechteck eingefügt wird, die Mausposition (links oben / rechts unten) ermitteln und eine bestehende Liste Deiner Rechtecke durchlaufen, wobei Du bei jedem Eintrag prüfen musst, ob eine Überlappung vorliegt. Als Tipp zur Prüfung bietet sich folgender Algorithmus Algorithmus von Cohen-Sutherland ? Wikipedia in entsprechend abgewandelter Form an: Das bestehende stellt das Zentrum da, und das neue darf nur gezeichnet werden, wenn sowohl linke obere und rechte untere innerhalb einer Spalte oder Zeile liegen, da sonst eine Überlappung besteht

HTH Phil

Geschrieben

Hi,

danke, vielleicht probiere ich den Algorithmus aus.

aber wie kann ich die Mausposition links unten und rechts oben für bestehende Rechtecke überprüfen zum neuen Rechteck?

Gruß, Bernd

Geschrieben

Speichere sie z.B. in einer Liste o.ä. ggf stellt SWT / Swing etwas entsprechendes zur Verfügung. Meines Wissens kannst Du auch von jedem Graphikobjekt die Koordinaten Dir liefern lassen.

Das neue Rechteck stellt das Zentrum des Algorithmus dar (den sichtbaren Bereich). Im Grunde nimmst Du dann von einem bestehenden die beiden Ecken und würdest eine Linie zwischen diesen Koordinaten zeichnen, wenn sie durch den mittigen Quadranten läuft, würden sich die Rechtecke überlappen

Phil

  • 2 Wochen später...
Geschrieben

list.size() liefert Dir die Anzahl der Einträge Deiner Arraylist zurück, mehr macht es nicht. Dein Code ist generell sehr unstrukturiert und darum solltest Du wissen, was Du programmiert hast. Als generellen Tipp kann ich Dir geben, dass Du Deine Strukturen etwas besser definieren solltest, ebenso wie, dass Du dir einmal Gedanken machen solltest, was passiert, wenn Du einen Click ausführst, der Algorithmus läuft und zu dieser Zeit ein weiterer Click statt findet (Stichwort "Synchronisation").

Zur Usability würde ich Dir raten, dass man das Zeichnen einen Rechtsecks so durchführt, dass Du den ersten Click abfängst, dies entspricht dann der oberen linken Ecke und sobald der Mausbutton wieder los gelassen wird, Du diesen Punkt als rechte untere Ecke definierst. Wenn Du diese beiden Koordinaten hast, erst dann beginnst Du mit der Prüfung. Achte aber dann auf die Sychronisation

Phil

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...