Internetprogrammering - laboration 2

Mål

Målet med denna laboration är att du skall lära dig hur man kan skapa enkla interaktiva applets med hjälp av AWT. Du kommer att använda dig av layout-hanterare, händelsehantering samt grafik.

Uppgift

Utöka OOPExemplet med konstruktionsmetoder, d.v.s. metoder för att rita trianglar, kvadrater och cirklar. Lägg också till en möjlighet att ta bort figurer genom att klicka på dem.

Storleken på de objekt du lägger till kan bestämmas endera (enklast) genom att ge ett värde i ett textfält eller genom någon form av gummibandsteknik (roligare). Gummibandning går till så att man anger en punkt (centrum i vårt fall eftersom alla figurer beskrivs med en centrumpunkt och en storlek) genom att peka med muspekaren samt trycka ned en musknapp. När man sedan rör musen med knappen nedtryckt ändrar figuren storlek med hänsyn till muspekarens placering. När man släpper knappen bestämmer man slutgiltig storlek.

Appleten delas enklast in i två delar: en kommandopanel överst och själva ritytan - den nuvarande appleten - under. Om man använder sig av appletens default-layout-hanterare räcker det då att placera, med add(), en (subklass till) Panel och en (subklass till) Canvas i själva appleten.

Kommandopanelen kan t.ex. bestå av en CheckboxGroup för figurval, en CheckboxGroup för att välja mellan rita, ta bort eller flytta och ett textfält för storleksangivelse.

Alternativt kan man använda sig av de olika musknapparna eller någon tangentbordsmodifierare (shift och ctrl) för att välja mod (rita, ta bort, flytta).

Om du vill kan du också lägga till möjligheten att välja att rita fyllda eller ofyllda figurer.

Tips

Du kan läsa mer om hur man använder CheckboxGroup i den officiella dokumentationen. Enklast placerar du som sagt knapparna i en Panel med FlowLayout.

Hur du använder en TextField-komponent kan du också läsa i den officiella dokumentationen.

Observera att du inte behöver hantera händelser vare sig från CheckboxGroup eller TextField. När något händer på ritytan (MouseEvent) kan du hämta status från CheckboxGroup m.h.a. getSelectedCheckbox() och från textfältet m.h.a. getText().

Om du vill använda dig av musknappar eller tangenter för de olika moderna (rita, ta bort, flytta) kan du göra på följande sätt i din händelsehanterare:

//
// Musknapparna, shift-tangenten och ctrl-tangenten är bitar i ett ord
// som man kommer åt med metoden getModifiers().
// 
public void mousePressed( MouseEvent ev)
{
  if (ev.getModifiers() & ev.BUTTON2_MASK) { det var musknapp 2 }
  if (ev.getModifiers() & ev.BUTTON3_MASK) { det var musknapp 3 }
  if (ev.getModifiers() & ev.SHIFT_MASK)   { shift var nedtryckt }
  if (ev.getModifiers() & ev.CTRL_MASK)    { ctrl var nedtryckt }
}
Enklaste sättet att hantera lagringen av figurerna är nog att lagra dem i en Vector.

Exempel på hur den färdiga appleten kan se ut

Här finns två olika lösningar: en med ett textfält för storlek och en med gummibandsteknik. I båda fallen har kommandopanelen helt enkelt lagts ovanpå själva ritytan, appleten är inte indelad i två delar. En enda CheckboxGroup används. I båda versionerna tas alla figurer bort om man inte träffar (tillräckligt nära) mitten av en figur när "remove" är vald. I version ett (med textfält) kan man flytta en figur direkt vid skapandet medan version två ju ändrar storleken i stället.

Frågor

Om du undrar över något, om något är oklart, kontakta Bo Nordin: bosse@cb.uu.se