Rectangle verschieben

Alles was mit Swing und AWT zu tun hat

Moderatoren: wegus, Olek77

Antworten
plammy
Beiträge: 3
Registriert: 18.06.2012, 12:38

Rectangle verschieben

Beitrag von plammy » 19.06.2012, 13:43

Hallo Leute..
Ich hab folgendes Problemchen :) Ich versuche schon erstellte Rechtecke (anhand Benutzereingaben) auf dem JPanel mit der Mouse zu verschieben... Wenn ich mir das ausgeben lasse sehe ich dass wenn ich Mausdrag mache sich die Koordinaten tatsächlich richtig verändern.. der erstmal gezeichnete Rechteck bleibt aber auf dieselbe Stelle unbewegt :(..

Code: Alles auswählen

public class EditPanel extends JPanel implements MouseListener, MouseMotionListener
{

    Rectangle rect = new Rectangle(0,0,100,50);

    int lastX, lastY;
    boolean firstTime = true;
    boolean pressOut = false;   

    private List<Rectangle2D> rectangles = new ArrayList<>();

    Rectangle2D rec;
      
    //Colors
    Color grayRect = new Color(230,227,224);
    Color orangeRect = new Color(211,111,53);

    public  EditPanel()
    {
        addMouseListener(this);
        addMouseMotionListener(this);
    } 
    
    // Aktion beim Drücken der Maustaste
    public void mousePressed(MouseEvent e) 
    {  
        lastX = rect.x - e.getX();
        lastY = rect.y - e.getY();

        // Prüfe, ob der Mauskursor in dem Rechteck liegt, während man auf die Maustaste drückt
        if ( rect.contains(e.getX(), e.getY()) ) {
        updateLocation(e);
        } else {       
            pressOut = true;
        }
    } 


    // Aktion beim Loslassen der Maustaste
    public void mouseReleased(MouseEvent e) 
    {
        // Prüfe, ob der Mauskursor in dem Rechteck liegt, wenn man die Maustaste loslässt
        if ( rect.contains(e.getX(), e.getY()) ) {
            updateLocation(e);
        } else {
            pressOut = false;
        }
    }

    // Aktion dem Zeihen mit gedrücktem Maustaste
    public void mouseDragged(MouseEvent e) 
    {
        if ( !pressOut ) {
            updateLocation(e);
        } else {
           
        }
    }

    // Benötigte Methode für MouseListener.
    public void mouseMoved(MouseEvent e){}

    // Benötigte Methoden für MouseMotionListener.
    public void mouseClicked(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mouseEntered(MouseEvent e){}

    // Koordinate nach der Verschieben des Rechtecks
    public void updateLocation(MouseEvent e)
    {
        rect.setLocation(lastX + e.getX(), lastY + e.getY());
        System.out.println("lastX: " +lastX + " getX: "+e.getX()+ " lastY: " +lastY + " getY: "+ e.getY()); //hier zeigt er alles richtig auf der Konsole
        repaint();
     }

    protected void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
     
        //wenn JButton 'leer' ausgewählt wird, dann zeiche diese Art von Rectangles
        if(CreateFile.cf.onlyborderRect.isSelected()){
            borderrect(g);
        }
        //wenn JButton 'gefüllt' ausgewählt wird, dann zeiche diese Art von Rectangles
        if(CreateFile.cf.filledRect.isSelected()){
            filledrect(g);
        }
 
    }

    public void borderrect (Graphics g){
        
         //bausteinRect nur mit grauen Rahmen
            Graphics2D g2d = (Graphics2D) g;
         
                g2d.setPaint(Color.LIGHT_GRAY);
                g2d.setStroke(new BasicStroke(2.0f));

                rec = new Rectangle2D.Double(lastX, lastY,CreateFile.cf.bausteinW,CreateFile.cf.bausteinH);

                rectangles.add(rec);
                for (Rectangle2D r : rectangles) {
                    g2d.draw(r);
                }
            
    }
    
    public void filledrect (Graphics g) {
          //bausteinRect in orange
           Graphics2D g2d = (Graphics2D) g;
           
                g2d.setPaint(orangeRect);
 
                rec = new Rectangle2D.Double(lastX, lastY,CreateFile.cf.bausteinW,CreateFile.cf.bausteinH);

                rectangles.add(rec);
                for (Rectangle2D r : rectangles) {
                    g2d.fill(r);
                }     
    }
    

    
}

Benutzeravatar
Olek77
Beiträge: 669
Registriert: 21.03.2009, 13:09

Re: Rectangle verschieben

Beitrag von Olek77 » 21.06.2012, 15:00

Hi,

Der code ist relativ konfus.

Als Tipp:

Verwende eine private Instanz von Rectangle.

Code: Alles auswählen

private Rectangle r;

// ...

public void updatePosition( final int newX, finl int newY ) {
    r.x = newX;
    r.y = newY;
    repaint();
}
Sicher gibts dazu auch einige Beispiele im Netz.

Viele Grüße,

Olek
- Netbeans Certified Associate -

Antworten