Eigenes ArrayList Objekt

Mit unserem eigenem Objekt können wir eine Vielzahl von nützlichen Funktionen für unser Zeichenprogramm umsetzen. Zunächst wollen wir uns jedoch erst mit der Grundstruktur beschäftigen:

class Grafikobjekt {
  
  Point koordinaten;
  int stiftdicke;
  
  public Grafikobjekt(Point p, int sd) {
    this.koordinaten = p;
    this.stiftdicke = sd;
  }
}

Neben den zwei deklarierten Variablen brauchen wir nur noch einen Konstruktor der ebendiese notwendigen Daten übernimmt.
Um die Klasse zu korrekt zu kapseln brauchen wir jetzt noch sogenannte ‚getter‘. In Eclipse können diese unter Quelltext->Getter und Setter generieren automatisch erstellt werden wobei wir, um nur die Getter zu generieren, im Pop-Up einen Haken bei Getter setzen und auf ok gehen. Die Setter brauchen wir im Moment nicht.
So sieht unser Quelltext nach der Generierung der Getter aus:

class Grafikobjekt {
  
  Point koordinaten;
  int stiftdicke;
  
  public Grafikobjekt(Point p, int sd) {
    this.koordinaten = p;
    this.stiftdicke = sd;
  }

  public Point getKoordinaten() {
    return koordinaten;
  }

  public int getStiftdicke() {
    return stiftdicke;
  }
}

Jetzt noch der komplette Quelltext mit der Anwendung dieser Klasse:

package miniMalen1;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JToolBar;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Tafel extends JFrame {

  public static void main(String[] s) {
    new Tafel();
  }

  private ArrayList<Grafikobjekt> virtuellerBildschirm = new ArrayList<Grafikobjekt>();
  private JPanel panel;
  private int x = -10;
  private int y = -10;
  private JSpinner linienstaerke;
  private JToolBar auswahl;

  public Tafel() {
    initialisiereTafel();
  }

  private void initialisiereTafel() {
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setBounds(0, 0, 500, 500);
    this.setLocationRelativeTo(null);
    this.setAlwaysOnTop(true);
    this.setBackground(Color.white);
    this.setTitle("Tafel");
    this.setLayout(new BorderLayout());

    auswahl = new JToolBar();
    auswahl.setPreferredSize(new Dimension(300, 30)); // PreferredSize = bevorzugte Größe
    auswahl.setFloatable(false);
    this.add(auswahl, BorderLayout.PAGE_START);

    SpinnerNumberModel nummern = new SpinnerNumberModel(10, 1, 99, 1); // ( default, Minimum, Maximum, Schrittweite
                                      // )
    linienstaerke = new JSpinner(nummern);
    linienstaerke.setMinimumSize(new Dimension(50, 30)); // setzt die Mindestgröße ( Breite, Höhe )
    linienstaerke.setMaximumSize(new Dimension(50, 30)); // setzt die Maximalgröße

    auswahl.add(linienstaerke);

    sichtbar();

    panel = new JPanel() {

      public void paintComponent(Graphics g) {
        super.paintComponent(g);

        {
          for (int z = 0; z < virtuellerBildschirm.size(); z++) {
            Grafikobjekt go = virtuellerBildschirm.get(z);
            g.fillOval(go.getKoordinaten().x, go.getKoordinaten().y, go.getStiftdicke(),
                go.getStiftdicke());
          }
        }

      }

    };

    panel.setBackground(Color.WHITE);

    panel.setBounds(0, 0, 500, 500);
    this.add(panel);

    panel.addMouseMotionListener(new MouseAdapter() {
      public void mouseDragged(MouseEvent arg0) {
        System.out.println("Dragged");
        x = arg0.getX();
        y = arg0.getY();

        virtuellerBildschirm.add(new Grafikobjekt(new Point(x, y), (int) linienstaerke.getValue()));

        panel.repaint();
      }
    });

    panel.addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent arg0) {
        System.out.println("Pressed");
        x = arg0.getX();
        y = arg0.getY();

        virtuellerBildschirm.add(new Grafikobjekt(new Point(x, y), (int) linienstaerke.getValue()));

        panel.repaint();
      }
    });

  }

  private void sichtbar() {
    this.setVisible(true);

  }

  @Override
  public void stateChanged(ChangeEvent arg0) {
    System.out.println("Spinner betätigt");
  }

}

class Grafikobjekt {

  Point koordinaten;
  int stiftdicke;

  public Grafikobjekt(Point p, int sd) {
    this.koordinaten = p;
    this.stiftdicke = sd;
  }

  public Point getKoordinaten() {
    return koordinaten;
  }

  public void setKoordinaten(Point koordinaten) {
    this.koordinaten = koordinaten;
  }

  public int getStiftdicke() {
    return stiftdicke;
  }

  public void setStiftdicke(int stiftdicke) {
    this.stiftdicke = stiftdicke;
  }
}

In Zeile 25 setzen wir statt Point unser Grafikobjekt ein.
In 29 und 30 deklarieren wir einen JSpinner und eine JToolBar da wir noch weitere ‚Auswahlwerkzeuge‘ hinzufügen wollen und die JToolBar ein Container ist, der diese Werkzeuge ordnet.
In Zeile 45 – 48 initsialisieren wir die JToolBar und setzen die bevorzugte Größe. Außerdem ob die Toolbar abkoppelbar (true) oder nicht (false) sein soll. Anschließend setzen wir sie auf den Frame (Zeile 43). BorderLayout.PAGE_START sorgt dafür das sie oben festgesetzt wird.

In Zeile 50 bis 55 wird Ein SpinnerNumberModel erstellt das die Grenz- und Initialwerte des Spinners festlegt. Danach wird der Spinner mit dem Model initialisiert (Zeile 52) und die Minimum und Maximumgröße festgelegt.

In Zeile 88 und 100 wird dann in einer einzigen Zeile das Grafikobjekt erstellt und initialisiert.
linienstaerke ist ein Objekt das aus der Klasse JSpinner gebildet wurde und erbt daher alle Methoden von JSpinner. Da die Methode getValue der Klasse Spinner ein Objekt zurückgibt das den aktuellen Wert von unserem Spinner enthält, müssen wir dieses Objekt sozusagen verkleinern um den reinen Zahlenwert zu erhalten. Dies geschieht mit einem Cast. Indem wir einfach den Zieldatentyp in Klammern davor eingeben. Also (int).

In der for-Schleife (Zeile 66 bis 69 ) werden dann in unserer bekannten for-Schleife die Zahlen der einzelnen Grafikobjekte unseres virtuellen Bildschirms über die getter ausgelesen.

Jetzt wollen wir unsere Auswahlleiste mit weiteren Buttons befüllen und außerdem eine zweite JToolBar erstellen die vertikal ausgerichtet ist und dort unsere ersten Werkzuge wie Pinsel, Radiergummi und Farbwähler verankern.

Wie wir sicherlich bemerkt haben, wird der Quellcode durch das Hinzufügen von Komponenten recht schnell größer und dadurch unübersichtlicher. Deshalb werden wir zuerst unsere Zeichenfläche zu einem extra Objekt machen. Dadurch trennen wir den JFrame mit den zwei Werkzeugleisten und die Zeichenfläche in zwei logische Einheiten auf.

Fangen wir im nächsten Kapitel damit an.