© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
Figurer
Vejledende løsninger

 

 

1 Følgende klasse er et eksempel på hvordan opgaven kan løses:
 
SnapToGridFigur.java
import java.awt.Point;
import java.awt.Rectangle;
import CH.ifa.draw.figures.RectangleFigure;

class SnapToGridFigure extends RectangleFigure {
  private final static int GRID_SIZE_X = 25;
  private final static int GRID_SIZE_Y = 25;
  
  private int lostX, lostY;
  
  public SnapToGridFigure() {
    lostX = lostY = 0;
  }
  
  protected void basicMoveBy( int dx, int dy ) {
    super.basicMoveBy( dx, dy );
    
    snapToGrid();
  }
  
  public void basicDisplayBox( Point origin, Point corner ) {
    super.basicDisplayBox( origin, corner );
    
    snapToGrid();
  }
  
  private void snapToGrid() {
    Rectangle box = displayBox();
    
    int x = (int) box.getX();
    int y = (int) box.getY();
    
    if ( x % GRID_SIZE_X != 0 || y % GRID_SIZE_Y != 0 ) {
      x = snapValueToGrid( x + lostX, GRID_SIZE_X );
      y = snapValueToGrid( y + lostY, GRID_SIZE_Y );
  
      displayBox( new Rectangle( x, y, (int) box.getWidth(), (int) box.getHeight() ) );

      Rectangle after = displayBox();
    
      lostX += box.getX() - after.getX();
      lostY += box.getY() - after.getY();
    }
  }
  
  private int snapValueToGrid( int value, int grid ) {
    return value / grid * grid;
  }
}
Vi har placeret selve korrektionen af figurens position i en service-metode: snapToGrid. Denne metode kaldes i to situationer: når figuren flyttes, og når den resizes. basicMoveBy-metoden kaldes hver gang figuren flyttes, og basicDisplayBox-metoden kaldes når figuren resizes
I forbindelse med snapToGrid-metoden gemmer vi ændringer af koordinaterne, der er for små til at forårsage en flytning i forhold til grid'et. Ved at gemme dem i to instanvariable: lostX og lostY, sikrer vi os, at de ikke går tabt. Det betyder at en række små ryk i figuren på et tidspunkt summer sammen til at den flyttes i grid'et.