Zum Inhalt

Programmieren II

Herzlich willkommen zur Programmieren II-Veranstaltung! Wir haben in Programmieren I unter Verwendung der Programmiersprache Java bereits wesentliche Konzepte kennengelernt, die für das Verständnis moderner Programmierens notwendig sind. Diese Kenntnisse wollen wir nun erweitern und vertiefen. Wir werden Git kennenlernen, Exceptions, Wrapper-Klassen, Interfaces und Collections. Wir beschäftigen uns intensiv mit dem Testen von Programmen und erzeugen uns eigene Nutzeroberflächen. Hier einige Tipps, damit Sie die Veranstaltung erfolgreich durchführen und Sie dabei auch Spaß haben:

  1. Lösen Sie alle Übungsaufgaben selbständig! Es ist kein Problem, wenn Sie für das Bewältigen der Übungen etwas länger benötigen. Sollten Sie es gar nicht alleine schaffen, ist das auch kein Problem. Wichtig ist dann, dass Sie sich die Lösung anschauen und es erneut selbständig versuchen. Hören Sie nicht auf, bis Sie es geschafft haben!
  2. Sie können die Hausaufgaben zu zweit lösen. Achten Sie aber darauf, dass Sie Ihre gemeinsame Lösung vollständig verstanden haben und dass Sie sie danach auch alleine erstellen können. Sie können beim Lösen der Hausaufgaben beliebig kreativ sein! Die Aufgabenstellung gibt Ihnen Anhaltspunkte für eine eventuelle Lösung. Sie können es aber auch ganz anders machen!
  3. Die Klausurvorbereitung beginnt mit Beginn der Veranstaltung. Es ist nicht möglich, die Klausur am Ende des Semesters zu bestehen, wenn Sie nicht das ganze Semester über intensiv programmieren. Die Übungsaufgaben sind "kleine" Aufgaben, um das in der Vorlesung vermittelte Wissen direkt anzuwenden. Für die Lösung der Hausaufgaben ist bereits ein gewisses Abstraktionsniveau erforderlich, um zu erkennen, dass das in der Vorlesung vermittelte Wissen dafür ausreichend ist.
  4. Programmieren lernt man nur durch Programmieren. Sie müssen es tun. Das Lesen von Büchern oder das "Anschauen" von Code genügt nicht. Eine Sprache lernt man auch nur durch Sprechen. Sie müssen programmieren, programmieren, programmieren...
  5. Lassen Sie sich durch Fehler nicht verunsichern, sondern analysieren Sie Ihre Fehler. Bis zur Klausur sollten Sie alle Fehler einmal gemacht haben. Wenn Sie sich überlegen, warum das jeweils ein Fehler war, dann werden Sie diesen Fehler nicht wiederholen und haben durch die Reflektion eine Menge gelernt. Fehler zu machen (und darüber zu reflektieren) gehört zu den besten Lernmethoden des Programmierens.
  6. Haben Sie Spaß! Je mehr Sie das Programmieren lernen, je mehr Spaß werden Sie haben. Wir versuchen, dass Sie das ganze Semester über Spaß am Programmieren haben werden. Sollte es Ihnen zwischendurch keinen Spaß mehr machen, geben Sie mir sofort Bescheid!

Viel Erfolg! Und viel Spaß!

Organisatorisches

Der Plan zur Durchführung der Veranstaltung ist derzeit wie folgt:

  • Themen werden ausführlich in diesem Skript beschrieben und in den Vorlesungen eingeführt und verdeutlicht.
  • Die Veranstaltungen finden in Präsenz statt. Es werden keine Videos erstellt.
  • Das Skript wird für die jeweils kommende Woche freitags hochgeladen.
  • Mit dem Skript wird sowohl die Übung für die kommende Woche als auch die neue Aufgabe hochgeladen.
  • Die Übung (und die vergangene Aufgabe) werden donnerstags (8 - 9.30 bzw. 14-15.30 Uhr) besprochen. Sie können frei wählen, welche der beiden Übungen Sie besuchen.
  • Die Veranstaltung wird durch ein Tutorium unterstützt. Der Termin für das Tutorium wird noch bekanntgegeben.
  • Sollten Sie Wünsche haben, diesen Plan zu ändern, kommen Sie gerne auf mich zu

Zur erfolgreichen Durchführung der Veranstaltung sollten Sie die Aufgaben lösen und zu den jeweiligen Fristen auf Moodle hochladen. Es werden insgesamt wahrscheinlich 10 Aufgaben sein, die Sie selbständig lösen und hochladen. Sie können die Aufgaben auch zu zweit lösen. Sollte Ihre Lösung der Lösung entsprechen, die im Tutorium erarbeitet wurde, brauchen Sie diese Lösung nicht hochzuladen. Am Ende des Semesters schreiben wir eine Klausur (am Rechner). Diese Klausur wird bewertet und entspricht der Note für das gesamte "Programmieren"-Modul. Bitte beachten Sie, dass das Modul erfahrungsgemäß nur dann bestanden werden kann, wenn Sie die Übungen und Aufgaben selbstständig lösen können. Selbst wenn Ihnen zunächst eine eigene Lösung schwerfällt, müssen Sie es irgendwann im Laufe des Semsters - am besten, jeweils so schnell wie möglich - schaffen, diese Aufgaben selbstständig zu implementieren.

Unter Aufgaben sind die Aufgaben beschrieben, die Sie in jeder Woche ausführen sollen. Damit Sie dies erfolgreich erledigen können, ist jeweils angegeben, welche Themen Sie dafür durcharbeiten müssen. Das Durcharbeiten der jeweiligen Themen entspricht jeweils einer Vorlesung. Diese wird also selbständig durchgeführt.

Daneben gibt es jede Woche (zu jedem Thema) Übungen, die wir in den Übungszeiten besprechen. Diese dienen der Anwendung und der Festigung der erlangten Kenntnisse. Die Übungen sind kleine Aufgaben, an denen Sie das neue Wissen anwenden sollen. Die Übungen dienen der Befähigung, die (größeren) Aufgaben lösen zu können.

Für die Kommunikation untereinander verwenden wir Slack. Dort können Sie alle inhaltlichen und organisatorischen Fragen stellen. Ich fände es gut, wenn ich dort möglichst wenig Fragen - zumindest die inhaltlichen - beantworten müsste, sondern eine Art internes Diskussionsforum entsteht. Es ist sehr gewünscht, dort Fragen zu stellen und noch mehr gewünscht, diese von Ihnen dort beantwortet zu sehen. Damit wäre allen geholfen und ich kann besser erkennen, wo noch Nachhol- bzw. Erläuterungsbedarf bei den meisten besteht. Außerdem lernen Sie beim Beantworten der Fragen nochmals deutlich mehr. Das wäre super, wenn das klappt!

Grober Inhalt (kann sich noch ändern)

Wir beschäftigen uns dieses Semester mit weiteren Konzepten der Programmierung. Wir lernen weitere Datenstrukturen kennen (Collections), werden lernen, mit Exceptions umzugehen und implementieren Tests. Wir beschäftigen uns mit Grafischen Nutzeroberflächen (GUIs) und lernen, Nutzereignisse zu behandeln.

Nachfolgend der vorläufige Wochenplan (wird eventuell angepasst).

Woche Themen (Vorlesung) Übung Aufgabe Abgabe Aufgabe bis
1. 10.-14.04.2023 Organisatorisches, Wiederholung, Aufzählungstypen, Einstieg -  - -
1. 17.-21.04.2023 Wrapper-Klassen (boxing und unboxing)
Exceptions I
Übung 1 Aufgabe 1 27.04.2023
2. 24.-28.04.2023 Exceptions II Übung 2 Aufgabe 2 04.05.2023
3. 01.-05.05.2023 Collections (List und Set) Übung 3 Aufgabe 3 18.05.2023
4. 08.-12.05.2023 Collections (Map) und Abstrakte Klassen Übung 4 Aufgabe 4 25.05.2023
5. 15.-19.05.2023 - - - -
6. 22.-26.05.2023 Interfaces Übung 5 Aufgabe 5 01.06.2023
7. 29.-02.06.2023 GUI Einführung Übung 6 Aufgabe 6 08.06.2023
8. 05.-09.06.2023 GUI Ereignisse Übung 7 Aufgabe 7 15.06.2023
9. 12.-16.06.2023 ActionListener Übung 8 Aufgabe 8 22.06.2023
10. 19.-23.06.2023 Mausereignisse Übung 9 Aufgabe 9 29.06.2023
12. 26.-30.06.2023 Graphics Übung 10 Aufgabe 10 06.07.2023
13. 03.-07.07.2023 Zeichnen mit der Maus Übung 11  - -
14. 10.-14.07.2023 REST-API mit SpringBoot Übung 12  - -
28.07.2023 12:00 Uhr Klausur 1.PZ C 635 und C 639 - -
29.09.2023 12:00 Uhr Klausur 2.PZ Labore 6. Etage C-Gebäude - -

Inhalte

14.04.2023 - Einführung und Organisatorisches + Wiederholung + enum + Einstieg
Code aus der Vorlesung
package vorlesungen.vorlesung0414;

import javax.swing.JOptionPane;

public class Programmklasse {

    public static void printIrgendwas(String ausgabe) {
        System.out.println(ausgabe);
    }

    public static void printDay(int day) {
        switch(day) {
            case 0 -> System.out.println("Montag");
            case 1 -> System.out.println("Dienstag");
            case 2 -> System.out.println("Mittwoch");
            case 3 -> System.out.println("Donnerstag");
            case 4 -> System.out.println("Freitag");
            case 5 -> System.out.println("Samstag");
            case 6 -> System.out.println("Sonntag");
            default -> System.out.println("kein Tag");
        }
    }


    public static void printDay(String day) {
        switch(day) {
            case "Mo" -> System.out.println("Montag");
            case "Di" -> System.out.println("Dienstag");
            case "Mi" -> System.out.println("Mittwoch");
            case "Do" -> System.out.println("Donnerstag");
            case "Fr" -> System.out.println("Freitag");
            case "Sa" -> System.out.println("Samstag");
            case "So" -> System.out.println("Sonntag");
            default -> System.out.println("kein Tag");
        }
    }


    public static void printDay(Weekday day) {
        switch(day) {
            case MO -> System.out.println("Montag");
            case DI -> System.out.println("Dienstag");
            case MI -> System.out.println("Mittwoch");
            case DO -> System.out.println("Donnerstag");
            case FR -> System.out.println("Freitag");
            case SA -> System.out.println("Samstag");
            case SO -> System.out.println("Sonntag");
        }
    }

    public static void main(String[] args) {
        printIrgendwas("Endlich wieder Programmieren!");

        StaticLesson.print();

        Math.abs(-5);

        System.out.println(StaticLesson.PI);

        Konto k1 = new Konto();
        Konto k2 = new Konto();
        Konto k3 = new Konto();
        Konto k4 = new Konto();
        System.out.println(k4.knr);

        Konto[] konten = new Konto[5];
        for(int i = 0; i < konten.length; i++) {
            konten[i] = new Konto();
        }

        for(Konto element : konten) {
            System.out.println(element.knr);
        }

        for(int i = 0; i < konten.length; i++) {
            System.out.println(konten[i].knr);
        }

/*
        int result = JOptionPane.showConfirmDialog(null, "Wirklich beenden?", "Mein Titel", JOptionPane.YES_NO_CANCEL_OPTION);
        if(result == JOptionPane.NO_OPTION) {
            System.out.println("Nein geklickt");
        } else if(result == JOptionPane.YES_OPTION) {
            System.out.println("Ja geklickt");
        } else if(result == JOptionPane.CANCEL_OPTION) {
            System.out.println("Abbrechen geklickt");
        }

        String eingabe = JOptionPane.showInputDialog("Geben Sie eine Zahl :");
        System.out.println("Sie haben " + eingabe + " eingegeben");
*/

        printDay(5);
        printDay("hallo");

        printDay(Weekday.FR);

        Weekday day = Weekday.FR;
    }

}
package vorlesungen.vorlesung0414;

public class StaticLesson {

    public static final double PI = 3.14;

    public static void print() {
        System.out.println("Hallo FIW");
    }

}
package vorlesungen.vorlesung0414;

public enum Weekday {
    MO, DI, MI, DO, FR, SA, SO
}
package vorlesungen.vorlesung0414;

public class Konto {

    int knr;
    static int anzKonten = 0;

    Konto() {
        this.knr = anzKonten++;
    }

}
21.04.2023 - Wrapper-Klassen und Exceptions I
Code aus der Vorlesung
package vorlesungen.vorlesung0421;

import javax.swing.JOptionPane;

public class WrapperKlassen {

    public static void main(String[] args) {


        // Wertetyp --> Referenztyp

        // Kontruktoren deprecated -- nicht verwenden!
        Integer i1 = new Integer(100);
        Integer i2 = new Integer("100");

        Double d1 = new Double(5.5);
        Double d2 = new Double("5.5");

        // erste Moeglichkeit zur Objekterzeugung
        Integer i3 = Integer.valueOf(101);
        Integer i4 = Integer.valueOf("101");

        Character c1 = Character.valueOf('a');
        //Character c2 = Character.valueOf("a");

        Boolean b1 = Boolean.valueOf(true);
        Boolean b2 = Boolean.valueOf("true");

        // zweite Moeglichkeit - Auto-Boxing
        Integer i5 = 5000;
        Integer i6 = 5000;
        Integer i7 = 5001;
        // Integer i6 = "5000";

        Boolean b3 = true;


        // Referenztyp --> Wertetyp

        // erste Moeglichkeit xxxValue()

        int i10 = i3.intValue();
        boolean b10 = b1.booleanValue();

        // zweite Moeglichkeit Auto-Unboxing

        int i11 = i5;
        System.out.println(i5 == i6);   // false wegen Referenzvergleich
        System.out.println(i7 > i6);    // true wegen Auto-Unboxing
        boolean eingabeOk = false;
        String message = "Geben Sie eine Zahl ein : ";
        while(!eingabeOk) {

            String eingabe = JOptionPane.showInputDialog(message);
            System.out.println("Sie haben " + eingabe + " eingegeben.");

            try {
                //double nr2 = Double.parseDouble(eingabe);
                //System.out.println("double-Zahl " + nr2);
                int number = Integer.parseInt(eingabe);
                int nr1 = 5;
                int result = nr1 / number;
                System.out.println(nr1 + "/" + number + " = " + result);
                eingabeOk = true;
            } 
            catch(NumberFormatException e) {
                message = "Eingabe war keine Zahl!";
            }
            catch(ArithmeticException e) {
                message = "Durch 0 kann nicht dividiert werden!";
            }

        }

        System.out.println("Ende");


    }

}
Video der Vorlesung

28.04.2023 - Exceptions II
Code aus der Vorlesung
package vorlesungen.vorlesung0428;

public class Ausnahmen {

    static int getValueAtIndex(int[] field, int index) throws ArrayIndexOutOfBoundsException
    {
        return field[index];
    }

    static char getValueAtIndex(String input, int index) throws StringIndexOutOfBoundsException
    {
        return input.charAt(index);
    }

    public static void main(String[] args) 
    {
        String[] basen = {"2", "8", "10", "Hi"};
        double result= 0;

        for(int index = 0; index <= basen.length; index++) 
        {

            try {
                String basisString = basen[index];

                int basis = Integer.parseInt(basisString);

                for(int exp = 0; exp<6; exp++) {
                    result = Math.pow(basis, exp);
                    System.out.printf("%d ^ %d = %.0f %n", basis, exp, result);
                }

            }catch(NumberFormatException e)
            {
                System.out.println("keine Zahl!");
            }catch(ArrayIndexOutOfBoundsException e)
            {
                System.out.println("kein korrekter Index!");
            }

        }

        int[] arr = {1, 2, 3, 4, 5 };

        try {
            getValueAtIndex(arr, 5);
        } catch (ArrayIndexOutOfBoundsException e) {
            // TODO Auto-generated catch block
            //e.printStackTrace();
        }

        Triangle t1 = new Triangle(0, 4, 3);
        System.out.println(t1.area());


        System.out.println("Ende");
    }
}
package vorlesungen.vorlesung0428;

public class Triangle {
    private int a;
    private int b;
    private int c;

    public Triangle(int a, int b, int c) throws IllegalSideLengthException, IllegalTriangleException
    {
        if(a <= 0 || b<= 0 || c <= 0) 
        {
            throw new IllegalSideLengthException();
        } else if(a >= (b+c) || b >= (a+c) || c >= (a+b)) 
        {
            throw new IllegalTriangleException();
        }
        else {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    }

    public int circumference()
    {
        return this.a + this.b + this.c;
    }

    public double area()
    {
        double area = 0.0;
        double s = 0.5 * (this.a+this.b+this.c);
        area = Math.sqrt(s * (s-this.a) * (s-this.b) * (s-this.c));
        return area;
    }

    public boolean equilateral()
    {
        return this.a==this.b && this.b==this.c;
    }

    public boolean isosceles()
    {
        return this.a==this.b || this.b==this.c || this.c==this.a;
    }

    public void print()
    {
        System.out.println("Seiten          : a=" + this.a + ", b=" + this.b + ", c=" + this.c);
        System.out.println("Umfang          : " + this.circumference());
        System.out.println("Flaecheninhalt  : " + this.area());
        if(this.equilateral())
        {
            System.out.println("Das Dreieck ist gleichseitig.");
        }
        else
        {
            if(this.isosceles())
            {
                System.out.println("Das Dreieck ist gleichschenklig.");
            }
            else
            {
                System.out.println("Das Dreieck ist unregelmaessig.");
            }
        }
        if(this.isRightAngled())
        {
            System.out.println("Das Dreieck ist rechtwinklig.");
        }
        else
        {
            System.out.println("Das Dreieck ist nicht rechtwinklig.");
        }
        System.out.println();
    }

    public boolean sameCircumference(Triangle t)
    {
        return this.circumference()==t.circumference();
    }

    public boolean sidesAreEqual(Triangle t)
    {
        return (this.a==t.a && this.b==t.b && this.c==t.c) ||
                (this.a==t.b && this.b==t.c && this.c==t.a) ||
                (this.a==t.c && this.b==t.a && this.c==t.b);
    }

    public boolean isRightAngled()
    {
        return ((this.a*this.a == (this.b*this.b + this.c*this.c)) ||
                (this.b*this.b == (this.a*this.a + this.c*this.c)) ||
                (this.c*this.c == (this.b*this.b + this.a*this.a)));
    }

    public boolean isSmaller(Triangle t)
    {
        return this.area() < t.area();
    }

    public boolean isBigger(Triangle t)
    {
        return this.area() > t.area();
    }

}
package vorlesungen.vorlesung0428;

public class IllegalSideLengthException extends RuntimeException
{
    public IllegalSideLengthException(String s)
    {
        super(s);
    }

    public IllegalSideLengthException()
    {
        super("All sides must be greater than zero!");
    }
}
package vorlesungen.vorlesung0428;

public class IllegalTriangleException extends RuntimeException
{
    public IllegalTriangleException(String s)
    {
        super(s);
    }

    public IllegalTriangleException()
    {
        super("No side greater than the sum of the other sides!");
    }
}
12.05.2023 - Maps und Abstrakte Klassen
Code aus der Vorlesung
package vorlesungen.vorlesung0512;

import java.util.*;


public class Maps 
{
    public static void printShape(Shape s)
    {
        System.out.println("Area      : " + s.area());
        System.out.println("Perimeter : " + s.perimeter());
    }

    public static void main(String[] args) 
    {
        Map<Integer, String> table = new HashMap<>();
        table.put(12459, "Berlin");
        table.put(10435, "Berlin");
        table.put(18055, "Rostock");
        table.put(15711, "KW");
        table.put(15711, "Koenigs Wusterhausen");

        System.out.printf("%n%n--------- alle keys ---------%n%n");

        Set<Integer> keys = table.keySet();
        for(Integer key : keys)
        {
            System.out.println(key);
        }

        System.out.printf("%n%n--------- alle values ---------%n%n");

        Collection<String> values = table.values();
        for(String value : values)
        {
            System.out.println(value);
        }

        System.out.printf("%n%n--------- alle entries ---------%n%n");
        Set<Map.Entry<Integer, String>> entries = table.entrySet();
        for(Map.Entry<Integer, String> entry : entries)
        {
            System.out.println("PLZ: " + entry.getKey() + " Ort : " + entry.getValue());
        }

        System.out.printf("%n%n--------- Shape ---------%n%n");
        Shape s1 = new Rectangle(10, 20);
        System.out.println("Area      : " + s1.area());
        System.out.println("Perimeter : " + s1.perimeter());

        Shape s2 = new Circle(5.0);
        printShape(s1);
        printShape(s2);

    }

}
package vorlesungen.vorlesung0512;

public abstract class Shape {

    public abstract double perimeter();
    public abstract double area();

}
package vorlesungen.vorlesung0512;

public class Rectangle extends Shape
{
    private int width, height;


    public Rectangle(int width, int height) 
    {
        this.width = width;
        this.height = height;
    }

    @Override
    public double perimeter() 
    {
        return 2 * (this.width + this.height);
    }

    @Override
    public double area() 
    {
        return this.width * this.height;
    }

}
package vorlesungen.vorlesung0512;

public class Circle extends Shape
{
    private double radius;

    public Circle(double radius)
    {
        this.radius = radius;
    }

    @Override
    public double perimeter() 
    {
        return Math.PI * 2 * this.radius;
    }

    @Override
    public double area() 
    {
        return Math.PI * this.radius * this.radius;
    }

}
26.05.2023 - Interfaces
Code aus der Vorlesung
package vorlesungen.vorlesung0526;

public class Testklasse 
{

    public static void sortieren(Comparable[] unsortiert)
    {
        for(int bubble=1; bubble < unsortiert.length; bubble++)
        {
            for(int index = 0; index < unsortiert.length-bubble; index++)
            {
                if(unsortiert[index].compareTo(unsortiert[index+1]) > 0)
                {
                    Comparable tmp = unsortiert[index];
                    unsortiert[index] = unsortiert[index + 1];
                    unsortiert[index + 1] = tmp;
                }
            }
        }
    }

    public static void printArray(Printable[] arr)
    {
        for(Printable p : arr)
        {
            p.print();
        }
    }

    public static void main(String[] args) 
    {   


        System.out.printf("%n%n------------------------ Rectangle --------------------------%n%n");
        Rectangle[] rectArr = new Rectangle[6];
        rectArr[0] = new Rectangle(9, 13);
        rectArr[1] = new Rectangle(4, 17);
        rectArr[2] = new Rectangle(12, 5);
        rectArr[3] = new Rectangle(8, 9);
        rectArr[4] = new Rectangle(10, 11);
        rectArr[5] = new Rectangle(5, 15);
        System.out.println(rectArr[5] instanceof Rectangle);
        System.out.println(rectArr[5] instanceof Object);
        System.out.println(rectArr[5] instanceof Shape);
        System.out.println(rectArr[5] instanceof Comparable);
        System.out.println(rectArr[5] instanceof Printable);

        for(Rectangle r : rectArr)
        {
            System.out.println(r);
        }

        sortieren(rectArr);
        System.out.println();

        printArray(rectArr);

        System.out.println();
        printArray(rectArr);

        System.out.printf("%n%n------------------------ Shape --------------------------%n%n");
        Circle[] circArr = new Circle[6];
        circArr[0] = new Circle(5.0);
        circArr[1] = new Circle(5.5);
        circArr[2] = new Circle(4.0);
        circArr[3] = new Circle(2.5);
        circArr[4] = new Circle(7.0);
        circArr[5] = new Circle(1.0);
        for(Circle c : circArr)
        {
            System.out.println(c);
        }

        sortieren(circArr);
        System.out.println();

        for(Circle c : circArr)
        {
            System.out.println(c);
        }

        System.out.println();
        printArray(circArr);
    }

}
package vorlesungen.vorlesung0526;

public abstract class Shape {

    public abstract double perimeter();
    public abstract double area();

}
package vorlesungen.vorlesung0526;

public class Rectangle extends Shape implements Comparable<Rectangle>, Printable
{
    private int width, height;


    public Rectangle(int width, int height) 
    {
        this.width = width;
        this.height = height;
    }

    @Override
    public double perimeter() 
    {
        return 2 * (this.width + this.height);
    }

    @Override
    public double area() 
    {
        return this.width * this.height;
    }

    @Override
    public String toString()
    {
        String s = String.format("[ %3d x %3d = %7.2f ]", this.width, this.height, this.area());
        return s;
    }

    @Override
    public int compareTo(Rectangle o) 
    {
        return (this.width + this.height) - (o.width + o.height);
    }

    @Override
    public void print() 
    {
        System.out.println(this.toString());

    }

}
package vorlesungen.vorlesung0526;

public class Circle extends Shape implements Comparable<Circle>, Printable
{
    private double radius;

    public Circle(double radius)
    {
        this.radius = radius;
    }

    @Override
    public double perimeter() 
    {
        return Math.PI * 2 * this.radius;
    }

    @Override
    public double area() 
    {
        return Math.PI * this.radius * this.radius;
    }

    @Override
    public String toString()
    {
        String s = String.format("( radius: %.2f x --> area: %7.2f ]", this.radius, this.area());
        return s;
    }

    @Override
    public int compareTo(Circle o) {
        return (int)((this.radius - o.radius)* 10000);
    }

    @Override
    public void print() 
    {
        System.out.println(this.toString());
    }


}
package vorlesungen.vorlesung0526;

public interface Printable {

    public void print();

}
02.06.2023 - Graphical User Interfaces
Code aus der Vorlesung
package vorlesungen.vorlesung0602;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.*;


public class MyFirstWindow extends JFrame
{
    public MyFirstWindow()
    {
        super();
        this.setTitle("Mein erstes Fenster");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(800, 600);
        this.setLocation(300, 500);
        JPanel mainPanel = this.initContent();
        this.getContentPane().add(mainPanel);
        this.setVisible(true);
    }

    public JPanel initContent()
    {
        JPanel content = new JPanel();
        //content.setLayout(new FlowLayout(FlowLayout.CENTER, 120, 140));
        //content.setLayout(new GridLayout(3, 2, 20, 40));
        content.setLayout(new BorderLayout());
        /*
        JLabel label = new JLabel("Name langer Text: "); 
        content.add(label);

        JTextField input = new JTextField(30);
        content.add(input);
        */

        JButton button1 = new JButton("Button1");
        content.add(button1, BorderLayout.NORTH);
        JButton button2 = new JButton("Button2");
        content.add(button2, BorderLayout.EAST);
        JButton button3 = new JButton("Button3");
        content.add(button3, BorderLayout.SOUTH);
        JButton button4 = new JButton("Button4");
        content.add(button4, BorderLayout.WEST);
        JButton button5 = new JButton("Button5");
        content.add(button5, BorderLayout.CENTER);

        /*
        JButton button6 = new JButton("Button6");
        content.add(button6, BorderLayout.NORTH);

        JButton button7 = new JButton("Button7");
        content.add(button7);
        */

        return content;
    }
}
package vorlesungen.vorlesung0602;

public class Testklasse {

    public static void main(String[] args) 
    {
        new MyFirstWindow();
    }
}
09.06.2023 - Ereignisbehandlung
Code aus der Vorlesung
package vorlesungen.vorlesung0609;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Ereignisbehandlung extends JFrame
{
    JLabel output;
    Integer anzKlicks = 0;

    Ereignisbehandlung()
    {
        super();
        this.setTitle("Ereignisbehandlung");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel content = createContent();
        this.getContentPane().add(content);

        this.setSize(300, 200);
        this.setLocation(200,100);
        this.setVisible(true);
    }

    JPanel createContent()
    {
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());

        JPanel oben = new JPanel();
        JButton minus = new JButton("-");
        JButton plus = new JButton("+");
        oben.add(minus);
        oben.add(plus);
        minus.setActionCommand("minus");
        plus.setActionCommand("plus");
        minus.addActionListener(new ActionHandler());
        plus.addActionListener(new ActionHandler());
        mainPanel.add(oben, BorderLayout.NORTH);

        /*
        JButton button = new JButton("Klick mich");
        button.addActionListener(this);
        mainPanel.add(button, BorderLayout.NORTH);
        */

        this.output = new JLabel(this.anzKlicks.toString());
        this.output.setHorizontalAlignment(JLabel.CENTER);
        this.output.setFont(new Font ("Helvetica", Font.BOLD, 24));
        mainPanel.add(this.output, BorderLayout.CENTER);
        return mainPanel;
    }

    public static void main(String[] args) {
        new Ereignisbehandlung();

        Integer i1 = 120;
        Integer i2 = 120;
        Integer i3 = 5001;
        Integer i4 = 5001;
        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
    }

    /*
    @Override
    public void actionPerformed(ActionEvent e) 
    {
        Object source = e.getSource();
        if(source instanceof JButton) 
        {
            JButton srcBtn = (JButton)source;
            System.out.println("Button " + srcBtn.getText() + " geklickt");
            if(srcBtn.getActionCommand().equals("minus")) {
                this.anzKlicks--;
            } else if(srcBtn.getActionCommand().equals("plus")) {
                this.anzKlicks++;
            }
            if(this.anzKlicks < 0) this.output.setForeground(Color.RED);
            else this.output.setForeground(Color.BLACK);
            this.output.setText(this.anzKlicks.toString());
        }

    }
    */

    class ActionHandler implements ActionListener
    {

        @Override
        public void actionPerformed(ActionEvent e) 
        {
            Object source = e.getSource();
            if(source instanceof JButton)
            {
                JButton srcBtn = (JButton)source;
                System.out.println("Button " + srcBtn.getText() + " geklickt");
                if(srcBtn.getActionCommand().equals("minus")) {
                    Ereignisbehandlung.this.anzKlicks--;
                } else if(srcBtn.getActionCommand().equals("plus")) {

                }

            }

        }

    }
}
16.06.2023 - Ereignisbehandlung
Code aus der Vorlesung
package vorlesungen.vorlesung0616;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Ereignisbehandlung extends JFrame
{
    JLabel output;
    Integer anzKlicks = 0;

    Ereignisbehandlung()
    {
        super();
        this.setTitle("Ereignisbehandlung");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel content = createContent();
        this.getContentPane().add(content);

        this.setSize(300, 200);
        this.setLocation(200,100);
        this.setVisible(true);
    }

    JPanel createContent()
    {
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());

        JPanel oben = new JPanel();
        JButton minus = new JButton("-");
        JButton plus = new JButton("+");
        oben.add(minus);
        oben.add(plus);
        minus.setActionCommand("minus");
        plus.setActionCommand("plus");
        minus.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Ereignisbehandlung.this.anzKlicks--;
                Ereignisbehandlung.this.output.setText(Ereignisbehandlung.this.anzKlicks.toString());
            }

        });


        plus.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Ereignisbehandlung.this.anzKlicks++;
                Ereignisbehandlung.this.output.setText(Ereignisbehandlung.this.anzKlicks.toString());
            } 

        });


        mainPanel.add(oben, BorderLayout.NORTH);

        this.output = new JLabel(this.anzKlicks.toString());
        this.output.setHorizontalAlignment(JLabel.CENTER);
        this.output.setFont(new Font ("Helvetica", Font.BOLD, 24));
        mainPanel.add(this.output, BorderLayout.CENTER);
        return mainPanel;
    }

    public static void main(String[] args) {
        new Ereignisbehandlung();

        Integer i1 = 120;
        Integer i2 = 120;
        Integer i3 = 5001;
        Integer i4 = 5001;
        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
    }

    /*
    class ActionHandler implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            Object source = e.getSource();
            if(source instanceof JButton) 
            {
                JButton srcBtn = (JButton)source;
                System.out.println("Button " + srcBtn.getText() + " geklickt");
                if(srcBtn.getActionCommand().equals("minus")) {
                    Ereignisbehandlung.this.anzKlicks--;
                } else if(srcBtn.getActionCommand().equals("plus")) {
                    Ereignisbehandlung.this.anzKlicks++;
                }
                if(Ereignisbehandlung.this.anzKlicks < 0) Ereignisbehandlung.this.output.setForeground(Color.RED);
                else Ereignisbehandlung.this.output.setForeground(Color.BLACK);
                Ereignisbehandlung.this.output.setText(Ereignisbehandlung.this.anzKlicks.toString());
            }
        }

    }
    */


}
package vorlesungen.vorlesung0616;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Mausereignisse extends JFrame implements MouseListener
{
    private int size;
    private JPanel[][] panels;
    private JPanel panel;

    public Mausereignisse(int size)
    {
        super();
        this.size = size;
        this.setTitle("Mausereignisse");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = initContent(size);

        this.getContentPane().add(mainPanel, BorderLayout.CENTER);

        this.setSize(400,400);
        this.setVisible(true);
    }

    private Color randomColor() 
    {
        Random r = new Random();
        int red = r.nextInt(256);
        int blue = r.nextInt(256);
        int green = r.nextInt(256);

        Color c = new Color(red, blue, green);
        return c;
    }

    private JPanel initContent(int size)
    {
        this.panel = new JPanel();
        this.panel.setLayout(new GridLayout(size, size));
        this.panel.addMouseListener(this);

        this.panels = new JPanel[size][size];
        for (int row = 0; row < panels.length; row++) 
        {
            for (int col = 0; col < panels[row].length; col++) 
            {
                this.panels[row][col] = new JPanel();
                this.panels[row][col].setLayout(new BorderLayout());
                JLabel label = new JLabel(row + " " + col);
                label.setHorizontalAlignment(JLabel.CENTER);
                label.setFont(new Font("Verdana", Font.BOLD, 8));
                label.setForeground(Color.WHITE);
                //this.panels[row][col].add(label);
                this.panels[row][col].setBackground(randomColor());
                this.panel.add(this.panels[row][col]);
            }
        }
        return this.panel;
    }

    public static void main(String[] args) 
    {
        new Mausereignisse(250);

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        Point p = e.getPoint();
        System.out.println("mouseClicked --> [x=" + x + ", y=" + y + "] ( " +p.x+", " +p.y+")");

        if(e.isAltDown()) System.out.println("AltDown");
        if(e.isAltGraphDown()) System.out.println("AltGraphDown");
        if(e.isShiftDown()) System.out.println("ShiftDown");
        if(e.isMetaDown()) System.out.println("MetaDown");
        if(e.isControlDown()) System.out.println("ControlDown");

        if(e.getClickCount()==2) System.out.println("Doppelklick");

        int width = this.panel.getWidth();
        int height = this.panel.getHeight();

        int widthSinglePanel = width / this.size;
        int heightSinglePanel = height / this.size;

        int col = x / widthSinglePanel;
        int row = y / heightSinglePanel;
        System.out.println("width : " + width + " height : " + height );
        System.out.println("col   : " + col + " row  : " + row );

        this.panels[row][col].setBackground(randomColor());
    }

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("mousePressed");

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("mouseReleased");

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("mouseEntered");

    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("mouseExited");

    }
}
23.06.2023 - Graphics
Code aus der Vorlesung
package vorlesungen.vorlesung0623;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Mausereignisse extends JFrame 
{
    private int size;
    private JPanel[][] panels;
    private JPanel panel;

    public Mausereignisse(int size)
    {
        super();
        this.size = size;
        this.setTitle("Mausereignisse");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = initContent(size);

        this.getContentPane().add(mainPanel, BorderLayout.CENTER);

        this.setSize(400,400);
        this.setVisible(true);
    }

    private Color randomColor() 
    {
        Random r = new Random();
        int red = r.nextInt(256);
        int blue = r.nextInt(256);
        int green = r.nextInt(256);

        Color c = new Color(red, blue, green);
        return c;
    }

    private JPanel initContent(int size)
    {
        this.panel = new JPanel();
        this.panel.setLayout(new GridLayout(size, size));

        this.panels = new JPanel[size][size];
        for (int row = 0; row < panels.length; row++) 
        {
            for (int col = 0; col < panels[row].length; col++) 
            {
                this.panels[row][col] = new JPanel();
                this.panels[row][col].setLayout(new BorderLayout());
                JLabel label = new JLabel(row + " " + col);
                label.setHorizontalAlignment(JLabel.CENTER);
                label.setFont(new Font("Verdana", Font.BOLD, 8));
                label.setForeground(Color.WHITE);
                //this.panels[row][col].add(label);
                this.panels[row][col].setBackground(randomColor());
                this.panels[row][col].addMouseListener(new MouseListener() {

                    @Override
                    public void mouseClicked(MouseEvent e) {
                        int x = e.getX();
                        int y = e.getY();
                        Point p = e.getPoint();
                        System.out.println("mouseClicked --> [x=" + x + ", y=" + y + "] ( " +p.x+", " +p.y+")");

                        Object src = e.getSource();
                        JPanel here = (JPanel)src;
                        here.setBackground(randomColor());

                    }

                    @Override
                    public void mousePressed(MouseEvent e) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void mouseReleased(MouseEvent e) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void mouseEntered(MouseEvent e) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void mouseExited(MouseEvent e) {
                        // TODO Auto-generated method stub

                    }

                });
                this.panel.add(this.panels[row][col]);
            }
        }
        return this.panel;
    }

    public static void main(String[] args) 
    {
        new Mausereignisse(10);

    }

    /*
    @Override
    public void mouseClicked(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        Point p = e.getPoint();
        System.out.println("mouseClicked --> [x=" + x + ", y=" + y + "] ( " +p.x+", " +p.y+")");

        if(e.isAltDown()) System.out.println("AltDown");
        if(e.isAltGraphDown()) System.out.println("AltGraphDown");
        if(e.isShiftDown()) System.out.println("ShiftDown");
        if(e.isMetaDown()) System.out.println("MetaDown");
        if(e.isControlDown()) System.out.println("ControlDown");

        if(e.getClickCount()==2) System.out.println("Doppelklick");

        int width = this.panel.getWidth();
        int height = this.panel.getHeight();

        int widthSinglePanel = width / this.size;
        int heightSinglePanel = height / this.size;

        int col = x / widthSinglePanel;
        int row = y / heightSinglePanel;
        System.out.println("width : " + width + " height : " + height );
        System.out.println("col   : " + col + " row  : " + row );

        this.panels[row][col].setBackground(randomColor());
    }
    */

}
package vorlesungen.vorlesung0623;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Arc2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.Shape;
import java.util.Random;

import javax.swing.*;

public class Zeichnen extends JFrame
{

    Zeichnen()
    {
        super();
        this.setTitle("Wir zeichnen");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(500, 500);
        this.setLocation(200, 100);

        //JPanel content = initContent();
        Canvas canvas = new Canvas();
        this.getContentPane().add(canvas);
        this.setVisible(true);
    }

    class Canvas extends JPanel
    {
        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;

            g2.setStroke(new BasicStroke(3.0f));
            /*
            g2.drawRect(40, 30, 200, 200);
            for(int i = 0; i < 20; i++)
            {
                g2.setColor(Zeichnen.this.randomColor());
                g2.drawOval(40 + i*10, 30 + i*10, 200, 200);
            }
            */

            int widthJPanel = this.getWidth();
            int heightJPanel = this.getHeight();
            double x = widthJPanel / 10.0;
            double y = heightJPanel /10.0;
            double widthShape = widthJPanel * 0.8;
            double heightShape = heightJPanel * 0.8;

            Shape rectangle = new Rectangle2D.Double(x, y, widthShape, heightShape);
            Shape circle = new Ellipse2D.Double(x,y, widthShape, heightShape);

            //g2.draw(circle);
            //g2.draw(rectangle);
            g2.setStroke(new BasicStroke(3.0f));
            //g2.setColor(Color.RED);
            //g2.fill3DRect((int)x, (int)y, (int)widthShape, (int)heightShape, true);

            Shape arc = new Arc2D.Double(x, y, 2 * widthShape, 2 * heightShape, 90, 90, Arc2D.CHORD);
            g2.draw(arc);

            System.out.println(widthJPanel + " x " + heightJPanel);
        }
    }

    private Color randomColor() 
    {
        Random r = new Random();
        int red = r.nextInt(256);
        int blue = r.nextInt(256);
        int green = r.nextInt(256);

        Color c = new Color(red, blue, green);
        return c;
    }

    JPanel initContent()
    {
        JPanel main = new JPanel();

        return main;
    }

    public static void main(String[] args) {
        new Zeichnen();
    }
}
30.06.2023 - Zeichnen mit der Maus
Code aus der Vorlesung
package vorlesungen.vorlesung0630;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.*;

public class Zeichnen extends JFrame implements MouseListener, MouseMotionListener
{
    Canvas canvas;
    List<Point> points;
    Linie line;
    List<Linie> lines;

    Zeichnen()
    {
        super("Wir zeichnen");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.canvas = new Canvas();
        this.canvas.addMouseListener(this);
        this.canvas.addMouseMotionListener(this);
        this.getContentPane().add(this.canvas);
        this.getContentPane().add(buttonPanel(), BorderLayout.SOUTH);

        this.setSize(500,500);
        this.setLocation(200,100);
        this.setVisible(true);

        this.points = new ArrayList<>();
        this.lines = new ArrayList<>();
    }

    JPanel buttonPanel()
    {
        JPanel btnPanel = new JPanel();
        JButton clearBtn = new JButton("clear");
        clearBtn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Zeichnen.this.lines.clear();
                Zeichnen.this.points.clear();
                Zeichnen.this.line = null;
                Zeichnen.this.canvas.repaint();

            }

        });

        btnPanel.add(clearBtn);
        return btnPanel;
    }

    class Canvas extends JPanel
    {
        final int DURCHMESSER = 30;

        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;

            //g2.drawLine(0, 0, this.getWidth(), this.getHeight());
            /*
             * for(Point p : Zeichnen.this.points) { g2.fillRect(p.x, p.y, DURCHMESSER,
             * DURCHMESSER); }
             */

            g2.setStroke(new BasicStroke(3.0f));

            for(int i = 0; i < Zeichnen.this.points.size()-1; i++)
            {
                g2.setColor(Zeichnen.this.randomColor());
                Point p1 = Zeichnen.this.points.get(i);
                Point p2 = Zeichnen.this.points.get(i+1);
                g2.drawLine(p1.x, p1.y, p2.x, p2.y);

            }


            for(Linie l : Zeichnen.this.lines)
            {
                g2.setColor(l.getColor());
                g2.drawLine(l.getStart().x, l.getStart().y, l.getEnd().x, l.getEnd().y);
            }

            if(Zeichnen.this.line != null)
            {
                int x1 = Zeichnen.this.line.getStart().x;
                int y1 = Zeichnen.this.line.getStart().y;
                int x2 = Zeichnen.this.line.getEnd().x;
                int y2 = Zeichnen.this.line.getEnd().y;
                g2.setColor(Zeichnen.this.line.getColor());
                g2.drawLine(x1, y1, x2, y2);
            }
        }
    }

    Color randomColor()
    {
        Random ra = new Random();
        int r = ra.nextInt(256);
        int g = ra.nextInt(256);
        int b = ra.nextInt(256);
        return new Color(r,g,b);
    }

    public static void main(String[] args) {
        new Zeichnen();
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        Point p = e.getPoint();
        this.points.add(p);
        this.canvas.repaint();  // ruft paintComponent() auf

    }

    @Override
    public void mousePressed(MouseEvent e) {
        Point p = e.getPoint();
        Color color = Zeichnen.this.randomColor();
        this.line = new Linie(p,p, color);

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        this.lines.add(this.line);

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseDragged(MouseEvent e) {
        //System.out.println("dragged");
        Point p = e.getPoint();
        this.line.setEnd(p);
        this.canvas.repaint();

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        //System.out.println("moved");

    }
}
package vorlesungen.vorlesung0630;

import java.awt.Color;
import java.awt.Point;

public class Linie 
{
    private Point start;
    private Point end;
    private Color color;

    Linie(Point start, Point end)
    {
        this.start = start;
        this.end = end;
        this.color = Color.BLACK;
    }

    Linie(Point start, Point end, Color color)
    {
        this.start = start;
        this.end = end;
        this.color = color;
    }

    void setEnd(Point end)
    {
        this.end = end;
    }

    Point getStart()
    {
        return this.start;
    }

    Point getEnd()
    {
        return this.end;
    }

    Color getColor()
    {
        return this.color;
    }
}