Announcement

Collapse
No announcement yet.

Rechtecke nicht in vorhandene hineinzeichnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Rechtecke nicht in vorhandene hineinzeichnen

    Hallo,

    ich wollte durch Mausklick Rechtecke zeichnen (als Liste) und klickt man in ein vorhandenes Rechteck darf kein neues gezeichnet, außerhalb ja.(ein Rechteck soll nicht in einem anderen erscheinen)
    Wenn ich die aktuellen Mauskoordinaten mit dem aktuellen Recheck das dann in einem Obj gespeichert wird mit den schon gezeichneten Listenrechtecken vergleichen möchte mit contains und die alten Rechtecke durchlaufe, kommt durch list.size() ganz viele Rechtecke auf einmal in diesem Bereich.
    Kann mir da jemand helfen?


    Bernd


    Code:
    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);
    	}
    }


    Code:
    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);
    			}
    			
    		}
    	}
    	
    }

    Code:
    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;
    	}
    	*/
    }

    in der Klasse Rechteck_Panel dieser Bereich:
    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);
    }

    }
    }
    Attached Files
    Zuletzt editiert von Bernd123; 31.12.2008, 18:21.

  • #2
    Wäre ja schön, Sourcecode zu bekommen, der wenigsten auf anhieb compilierbar ist.

    Da nur ein Fenster erscheint und irgendwann ein Haufen Rechtecke und ich überhaupt nicht erkennen kann was ich wann machen soll, kann ich so nicht helfen. Auch die Tasten bringen wohl nichts

    Wahrscheinlich wird Ursache sein, dass du die Liste durchgehst und über MouseEntered jedoch diese immer erweiterst.

    Guten Rutsch
    Christian

    Comment


    • #3
      Des Weiteren habe ich auch nicht gefunden - kann an mir liegen - wo du prüfst, ob ein Rechteck innerhalb eines anderen liegt.

      Ist zwar C/C++ sollte aber umsetzbar sein:

      Code:
      template <typename T> 
      inline const bool Rect<T>::Intersection(const Rect<T> &rhs) const {
        return ((Bottom > rhs.Top)  && (Top  < rhs.Bottom) &&
                (Right  > rhs.Left) && (Left < rhs.Right));
      }
      Christian

      Comment

      Working...
      X