L'objectiu d'aquesta pràctica és començar a usar els conceptes de Classe i Objecte. Consisteix en desenvolupar una aplicació que mostri un dibuix simple fet amb figures geomètriques.

Al dibuix veiem una casa (mur, teulada i finestra) sobre la terra i un sol al cel.
El dibuix es composarà dels següents Objectes: sun, sky, earth, wall, window y roof
Aquests objectes estaran classificats en les següents Classes: Circle, Rectangle y Triangle
Inicia IntelliJ i crea un nou projecte:

Recorda marcar la opció "Create project from template" i selecciona la plantilla "Command Line App":

Posa-li el nom

Per a crear objectes, primer s'ha de definir la classe. A partir de la classe es creen els objectes.
Començarem per l'objecte sun, que és de la classe Circle.
Fes clic-dreta sobre el package

Com a nom de la Classe introdueix
Polsa OK.

Observa que s'ha creat el fitxer
class Circle { }
Un cop definida la classe
Ves l'arxiu
public class Main { public static void main(String[] args) { Circle sun = new Circle(); } }

Definirem l'estat dels objectes de classe
Ves a l'arxiu
public class Circle { int radius; int positionX; int positionY; Color color; }
Hauràs notat que la paraula
Per a importar la classe

Ara l'objecte
Ves a l'arxiu
public class Main { public static void main(String[] args){ Circle sun = new Circle(); sun.radius = 40; sun.positionX = 440; sun.positionY = 50; sun.color = Color.YELLOW; } }
Ja tenim creat l'objecte
Per a dibuixar els objectes a la pantalla utilizarem la Classe
Crea una Classe nova anomenada
import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.List; public class Canvas extends javax.swing.JPanel { static Canvas canvas; static List<Object> objects = new ArrayList<>(); public Canvas() { JFrame frame = new JFrame(); frame.add(this); frame.setSize(600, 400); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void paint(Graphics g) { for(Object o: objects) try { Class c = o.getClass(); String n = c.getName(); if(!n.endsWith(".Circle")&&!n.endsWith(".Rectangle")&&!n.endsWith(".Triangle"))continue; int x = (int) c.getDeclaredField("positionX").get(o); int y = (int) c.getDeclaredField("positionY").get(o); g.setColor((Color) c.getDeclaredField("color").get(o)); if (n.endsWith(".Circle")) { int r = (int) c.getDeclaredField("radius").get(o); g.fillOval(x, y, r * 2, r * 2); } else { int w = (int) c.getDeclaredField("width").get(o); int h = (int) c.getDeclaredField("height").get(o); if (n.endsWith(".Rectangle")) g.fillRect(x, y, w, h); else g.fillPolygon(new int[]{x,x+w/2,x+w},new int[]{y+h,y,y+h},3); } } catch (Exception e){ e.printStackTrace(); } } public static void draw(Object c) { if(canvas==null) canvas = new Canvas(); objects.add(c); } }
Afegeix al mètode
Canvas.draw(sun);
Polsa sobre el botó

Seguim amb la resta d'objectes del nostre dibuix.
Seguim amb els objectes
Afegeix el següent codi al mètode
public class Main { public static void main(String[] args){ Circle sun = new Circle(); sun.color = Color.YELLOW; sun.positionX = 440; sun.positionY = 50; sun.radius = 40; Circle window = new Circle(); window.color = Color.GRAY; window.positionX = 240; window.positionY = 215; window.radius = 10; Circle earth = new Circle(); earth.color = Color.GREEN; earth.positionX = -300; earth.positionY = 250; earth.radius = 600; } }
Afegeix al mètode
Canvas.draw(earth); Canvas.draw(window);
Un cop creats tots els objectes de tipus cercle, seguirem amb els rectangles (wall, sky) i triangles (roof).
Crea les classes
public class Rectangle { int width; int height; int positionX; int positionY; Color color; }
public class Triangle { int width; int height; int positionX; int positionY; Color color; }
Torna a l'arxiu
Rectangle wall = new Rectangle(); wall.width = 100; wall.height = 80; wall.positionX = 200; wall.positionY = 200; wall.color = Color.WHITE; Rectangle sky = new Rectangle(); sky.width = 600; sky.height = 400; sky.positionX = 0; sky.positionY = 0; sky.color = Color.CYAN; Triangle roof = new Triangle(); roof.width = 100; roof.height = 50; roof.positionX = 200; roof.positionY = 150; roof.color = Color.RED;
Afegeix al mètode
Canvas.draw(sky); Canvas.draw(wall); Canvas.draw(roof);
Les Classes es poden entendre com una plantilla a partir de la qual es poden crear Objectes. Cada Objecte és una còpia diferent de la plantilla. Per tant cada Objecte té una còpia dels camps que s'han definit a la Classe. Es poden assignar diferents valors a cada camp de cada Objecte de forma independent.
El següent gràfic explica les Classes i Objectes que s'han creat per a fer el dibuix:

Els objectes s'emmagatzemen a la memòria de l'ordinador. Com és evident, a la memòria no s'hi poden dibuixar cercles, rectangles, ni triangles. En realitat el que s'està emmagatzemant en memòria és la informació sobre aquests objectes, és a dir els valors dels seus camps. Una representació més adequada dels objectes seria aquesta:
