# Calendar Funktionen



## FiselM (12. Januar 2008)

Hallo, ich habe ein Problem, ich will einen Terminplaner in Java realisieren mit dem ich 
verschiedene Termine sowie eine Beschreibung der Termine in einem Kalender verwalten kann und die Termin mit einer Funktion sortiert anzeigen kann?


```
import ConsoleInOut.*;
import java.util.*;
import java.text.*;
class TerminplanerUI
{
GregorianCalendar aD   = new GregorianCalendar();
 public static void main(String arg[])
 {
     
     int Eingabe = 0;
     int Jahr = 0;
     int Monat = 0;
     int Tag = 0;
     String Beschreibung;
     while (Eingabe!= 3)
     {
         {
          System.out.println("----------------------------------------------------------------------");
          System.out.println("Bitte wählen Sie zwischen folgenden Funktionen: ");
          System.out.println();
          System.out.println("Neuer Termin:      1");
          System.out.println("Termine anzeigen:  2");
          System.out.println("Anwendung beenden: 3");
          System.out.println("----------------------------------------------------------------------");
          Eingabe = Console.console_in_int();
          } 
          if (Eingabe == 1)
            {
                Terminplaner terminpl = new Terminplaner();
                //Calendar aD = Calendar.getInstance();
                
                System.out.println();
                System.out.println("Bitte geben Sie den Termin ein: ");
                System.out.println("Jahr: ");
                Jahr = Console.console_in_int();
                System.out.println("Monat: ");
                Monat = Console.console_in_int();
                System.out.println("Tag: ");
                Tag = Console.console_in_int();
                System.out.println("Terminbeschreibung: ");
                Beschreibung = Console.console_in();
                System.out.println();
                 aD.set(GregorianCalendar.YEAR, Jahr);
		         aD.set(GregorianCalendar.MONTH, Monat);
			     aD.set(GregorianCalendar.DATE, Tag);
                 Date date = aD.getTime();	
			     System.out.println(date);
            }
          if (Eingabe == 2)
            {
                System.out.println("Inhalt des Terminkalenders");
                

            }
          if ((Eingabe != 1) && (Eingabe != 2) && (Eingabe != 3))  
            {
                System.out.println("Falsche Eingabe - Bitte neu wählen im Menue");
            }
      }
     System.out.println("Die Anwendung wurde beendet.");
 }
}


public class Terminplaner
{
 //Attribute
 private String beschreibung;
 private String date;
 //private double verkaufspreis;
 //Konstruktor
 public Terminplaner()
 {
 }
 
 public String getBeschreibung()
 {
  return beschreibung;
 }
 public String getDate()
 {
  return date;
 }
 
 //Schreibende Methoden

 public void setBeschreibung(String Beschreibung)
 {
  beschreibung = Beschreibung;
 }
  public void setDate(String Date)
 {
  date = Date;
 }
}
```

Ich hänge bei der Erzeugung des Kalenders und der Befüllung mit Daten.

Bitte um Hilfe. Viele Grüße,


----------



## gk71 (14. Januar 2008)

hmm,
ne etwas genauere Beschreibung wo genau es hängt wäre vielleicht hilfreich ...

aber mal zwei Sachen, 

a) das ändert zwar nix an der Funktion, aber laut Konvention wäre es schöner Variablen grundsätzlich mit Kleinbuchstaben zu beginnen, macht den Code auch leichter zu lesen. Und hilft bisweilen sogar Fehler zu vermeinden

weil

b) bei setdate benutzt Du Date als Variablennamen. Das macht Dir wohl Probleme, da Date eine bereits existierende Java-Klasse ist.

Übrigens, es ist kein Problem den Parameter einer Methode genau so zu nennen, wie eine Member-Variable der Klasse (also in dem Fall das kleingeschriebene date). Du musst dann nur die Member-Variable durch "this" ansprechen.


```
public void setDate(String date)
 {
  this.date = date;
 }
```

Ach ja, so lange Du die Klasse TerminplanerUI nicht instanziierst wird auch aD nicht mit nem Kalender initialisiert. Möglicherweise wolltest Du den Kalender aD als static deklarieren, und in der main-Methode initialisieren ... Es wird wohl auch nicht gehen aD in main anzusprechen, so lange es nicht static ist 

Vielleicht wolltest Du auch main nur benutzen, um eine Instanz von Terminkalender zu erzeugen, die wiederum eine die TerminkalenderUI-Klasse instanziiert, in der dann eine Funktion aufgerufen würde, die das macht, was main gerade macht.
Evtl. wolltest Du auch im Main nur eine Instanz von TerminplanerUI erzeugen, usw. ...

viele Grüße

Stefan


----------



## FiselM (14. Januar 2008)

Wie schaffe ich es das ich pro Durchlaufene Schleife ein Datum erfassen kann
und es in einem Gregorianen Calendar speichern kann und die verschiedene Daten
wieder ausgeben kann. Bei meiner Routine überschreibt er pro Durchlauf immer das alte 
Datum?


```
import ConsoleInOut.*;
import java.util.*;
import java.text.*;
class MichaelUI
{
//GregorianCalendar aD1   = new GregorianCalendar();
 public static void main(String arg[])
 {
     
     int eingabe = 0;
     int jahr = 0;
     int monat = 0;
     int tag = 0;
              while(eingabe!=1)
              {
                // Testa terminpl1 = new Testa(int jahr);
                Calendar aD1 = Calendar.getInstance();
                System.out.println("1 für Abbruch: ");
                System.out.println("Eingabe: ");
                eingabe = Console.console_in_int();
                System.out.println();
                System.out.println("Bitte geben Sie den Termin ein: ");
                System.out.println("Jahr: ");
                jahr = Console.console_in_int();
                System.out.println("Bitte geben Sie den Termin ein: ");
                System.out.println("Monat: ");
                monat = Console.console_in_int();
                System.out.println("Bitte geben Sie den Termin ein: ");
                System.out.println("Tag: ");
                tag = Console.console_in_int();
                 
                aD1.set(GregorianCalendar.YEAR, jahr);
		        aD1.set(GregorianCalendar.MONTH, monat - 1);
		        aD1.set(GregorianCalendar.DATE, tag);
		        
		        System.out.println("Datum: " + aD1.get(GregorianCalendar.YEAR)+ "." +aD1.get(GregorianCalendar.MONTH));
		      } 
		      }        
}
```

Viele Grüße, Michael


----------



## gk71 (14. Januar 2008)

Hallo Michael,
Also das ganze hier heisst zwar Tutorial.de ... aber ich glaube nicht, dass das Forum dazu gedacht ist einen Programmierkurs zu machen. Du fragst sehr grundlegende Sachen. Ich würde Dir sehr ans Herz legen mal ein bisschen Einsteigerlieteratur über Java zu lesen. Probier mal:

http://www.galileocomputing.de/openbook/javainsel7/

oder (falls Du gut englisch kannst)

http://java.sun.com/docs/books/tutorial/

Da findest Du schon viele Antworten und gute Beispiele wie man das eine oder andere Problem angeht.

So, das war die Gardienenpredigt, jetzt zu Deiner Frage. Um mehrere Daten zu speichern kannst Du verschiedene Wege gehen. Der wahrscheinlich effektivste wäre über eine ArrayList. In der kannst Du jedes mal einen NEUEN GregorianCalendar mit dem jeweils neuen Datum hinzufügen. Später kannst Du die Calender über den eingebauten Iterator wieder auslesen (oder einfach über den Index). Falls Du zu jedem Datum eine Beziehung herstellen willst (z.B. eine Eingabe, die gemacht wurde) kannst Du auch eine HashTable verwenden (bitte dazu die Literatur zu Rate ziehen  ). Falls Du vorher schon genau weisst, wieviele Daten es sein werden könntest Du auch ein Array verwenden (GregorianCalendar[] ), aber das dürfte für Deine Anwendung nicht flexibel genug sein.

Ich hoffe das hat Dir jetzt ein bisschen geholfen. Wie gesagt, zur genauen Anwendung schau bitte in den Tutorien und Referenzen, die es massenhaft im Netz gibt  ... 

Ach ja, denk daran, so wie Du das angehst sind Deine Daten nur in der main-Methode vorhanden, falls Du die Daten an anderer Stelle verwenden willst, solltest Du eine eigene Klasse verwenden, oder zumindest eine static Variable. Dazu noch ein Stichwort "Objektorientierte Programmierung". Die statische main-Methode dient eigentlich nur als Einstiegspunkt. Ab da würde man normalerweise eine Klasse instanziieren, die Daten halten kann, und Funktionen ausführen kann.... 

Hmmm ... gerade fällt mir was auf. Ich hoffe Du bist nicht der irrigen Meinung der GregorianCalender sei so was wie Dein Taschenkalender. Der GregorianCalender dient lediglich dazu ein Date-Objekt im Gregorianischen Kalender (z.B. gibt es in Indien, oder im Islamischen Raum, andere Kalender als z.B. der Gregorianische Kalender, der im europäischen/westlichen Kulturbereich gültig ist) darzustellen. Damit kannst Du nicht irgenwie sagen am soundsovielten habe ich den und den Termin, und ne Woche später nen anderen. Der GC hält nur ein einziges Datum!

viel Spaß noch beim tüfteln, viele Grüße

Stefan


----------



## FiselM (20. Januar 2008)

Ich erhalte beim Debuggen einer Klasse Termin3 die Fehlermeldung

java.util.calendar is abstract, cannot be instantiated

das hängt wohl mit der Vererbung von der Klasse Calendar ab. Kann mir jemand sagen wie man das Problem umgeht?

Viele Grüße, Michael


----------



## Matze (21. Januar 2008)

Hi,

schau mal abundzu in die Java API. Dann siehst du dass die Calendar-Klasse Methoden hat. Und da ist auch eine dabei die dir eine neue 'Calendar-Instanz erzeugt:
	
	
	



```
Calendar.getinstance()
```


----------



## madara (17. Januar 2010)

habe das gleiche problem!
also bei läuft es nicht ganz so gut!

so sollte ein beispiel ausruf aussehen aber bei mir geht es nicht so gut!

```
-----------------------------------------------
Bitte wählen Sie zwischen folgenden Funktionen:

Neuer Termin: 1
Termine anzeigen: 2
Anwendung beenden: 3
-----------------------------------------------
neuer Termin
Keine gültige Eingabe.
-----------------------------------------------
Bitte wählen Sie zwischen folgenden Funktionen:

Neuer Termin: 1
Termine anzeigen: 2
Anwendung beenden: 3
-----------------------------------------------
1
Bitte geben Sie den Termin ein: 
Jahr:
2006
Monat:
12
Tag:
5
Terminbeschreibung:
Treffen mit Hans
-----------------------------------------------
Bitte wählen Sie zwischen folgenden Funktionen:

Neuer Termin: 1
Termine anzeigen: 2
Anwendung beenden: 3
-----------------------------------------------
1
Bitte geben Sie den Termin ein: 
Jahr:
2006
Monat:
5
Tag:
3
Terminbeschreibung:
Treffen mit Max
-----------------------------------------------
Bitte wählen Sie zwischen folgenden Funktionen:

Neuer Termin: 1
Termine anzeigen: 2
Anwendung beenden: 3
-----------------------------------------------
2
Termin: Nr. 1
Datum: 3.5.2006
Beschreibung:
Treffen mit Max

Termin: Nr. 2
Datum: 3.11.2006
Beschreibung:
Mein Name ist Markus Mustermann.

Termin: Nr. 3
Datum: 5.12.2006
Beschreibung:
Treffen mit Hans

-----------------------------------------------
Bitte wählen Sie zwischen folgenden Funktionen:

Neuer Termin: 1
Termine anzeigen: 2
Anwendung beenden: 3
-----------------------------------------------
3
-----------------------------------------------
Die Anwendung wurde beendet.
-----------------------------------------------
```



das ist mein code bisher:


```
import inout.Console;
import java.util.*;
import java.text.*;
class TerminplanerUI
{
 public static void main(String arg[])
 {
     
     int eingabe = 0;
     int jahr = 0;
     int monat = 0;
     int tag = 0;
     String beschreibung;
     
     {
         {
          System.out.println("----------------------------------------------------------------------");
          System.out.println("Bitte wählen Sie zwischen folgenden Funktionen: ");
          System.out.println();
          System.out.println("Neuer Termin:      1");
          System.out.println("Termine anzeigen:  2");
          System.out.println("Anwendung beenden: 3");
          System.out.println("----------------------------------------------------------------------");
          eingabe = Console.readInt();
          }
          while (eingabe != 3)
            {
                Terminplaner terminpl = new Terminplaner();
                //Calendar aD = Calendar.getInstance();
               
                System.out.println();
                System.out.println("Bitte geben Sie den Termin ein: ");
                System.out.println("Jahr: ");
                jahr = Console.readInt();
                System.out.println("Monat: ");
                monat = Console.readInt();
                System.out.println("Tag: ");
                tag = Console.readInt();
                System.out.println("Terminbeschreibung: ");
                beschreibung = Console.readString();
                System.out.println(tag + "." + monat + "."+ jahr + "  " + beschreibung);
            
            }
            
        

            
            
          if (eingabe == 2)
            {
                System.out.println("Inhalt des Terminkalenders");

 
            }
          if ((eingabe != 1) && (eingabe != 2) && (eingabe != 3))  
            {
                System.out.println("Falsche Eingabe - Bitte neu wählen im Menue");
            }
      }

      
      
     if (eingabe == 3)
     {
     System.out.println("Die Anwendung wurde beendet.");
    }

    
 }
    
}
```


----------



## DosCoder (17. Januar 2010)

Hi,


madara hat gesagt.:


> habe das gleiche problem!
> also bei läuft es nicht ganz so gut!
> 
> so sollte ein beispiel ausruf aussehen aber bei mir geht es nicht so gut!


_Was 'geht nicht ganz so gut?_
Ich bin gerade an einem ähnlichem Projekt, ich habe das so realisiert, dass es eine Klasse Termin gibt, die verschiedene Attribute hat. Darunter auch das Datum. Dieses ist durch einen Kalendar dargestellt: 

```
Calendar date = Calendar.getInstance();
date.set(...);
```
In die Set-Methode kommen die Datumsattribute rein, wie diese genau aussieht, lässt sich der Api entnehmen, die habe ich jetzt nicht da.

Die Termin-Objekte sind in einer Liste gepeichert und ich habe keine Probleme mit dem Datum oder anderem.

Wird Zeit, dass Sun mal eine gescheite Kalendar-API rausbringt.

Ciao
DosCoder


----------



## madara (17. Januar 2010)

Also da ich noch recht neu in java, verstehe ich es nicht so ganz was ich machen muss!
kannst du mein quellcode so verändern bzw. makrien was ich verändern muss?
Ahja und bei mir läuft es nicht so durch wie bei beispieldurchlauf! Wenn ich 1 drücke kann ich termin eingeben aber das wars dann auch!
ich will wie das im beispiele machen klappt aber nicht! Termindaten werden auch nicht gespeichert!


----------



## gk71 (18. Januar 2010)

lieber madara, 
zwei Sachen vorweg:
- Die main() Methode dient nur als Einstiegespunkt in das Java-Programm, und sollte nicht den gesamten Code im sog. "Spaghetti-Format" beinhalten, wie das in grauer Vorzeit bei Basic-Programmen normal war. In Java werden Klassen definiert, die Daten speichern, und Funktionen ausführen (bitte Deinen Lehrer Dir das noch mal genau zu erklären .. ich geh mal davon aus, dass es für die Schule ist).
- Die Calendar-Klasse aus Java ist kein Kalender im Sinne eines Taschenkalenders (s.o. in diesem Beitrag).

Was Du machen solltest ist Deine Terminplaner-Klasse mit Variablen zu bestücken, in denen Du die Termine als Date speicherst. Dann kannst Du  noch Funktionen erstellen, mit denen Du die Termine entsprechend verwalten kannst.

Schau Dir unbedingt auch noch mal das Konzept der objektorientierten Programmierung an!

In der main-Methode solltest nun Deinen Terminkalender instanziieren und benutzen. Würde in etwa so aussehen:

Schau Dir mal den Code in Ruhe an. Ich habe den nicht getestet, müsste aber so in etwa das machen, was Du brauchst. Versuch vor allem zu verstehen was da passiert. Du musst noch ein paar Sachen machen, so was wie überprüfen, ob die Eingaben stimmen, und die Verwaltung der Termine. Aber dazu lerne bitte selbständig aus der Api oder aus Tutorien, wie man die einzelnen Klassen anwendet (z.B. Calendar oder ArrayList, vielleicht brauchst Du auch andere Klassen).

Ach ja, dort wo neue Klasse steht musst Du eine neue Klasse anlegen, also eine neue Datei anlegen. Du kannst zwar alles in eine Datei einfügen. Aber das widerspricht den Java-Konventionen. Bei umfangreichen Programmen wäre das fatal.


```
import java.io.Console;
import java.text.SimpleDateFormat;
import java.util.Iterator;

public class TerminplanerUI {

    public static void main(String arg[])
     {
         String eingabe = "";
         String datum;
         String beschreibung;
         int error;

         Terminplaner terminpl = new Terminplaner();
         
         Console con = System.console();
         
         if (con != null)
         {
            while (true)
            {
                System.out.println("----------------------------------------------------------------------");
                System.out.println("Bitte wählen Sie zwischen folgenden Funktionen: ");
                System.out.println();
                System.out.println("Neuer Termin:      1");
                System.out.println("Termine anzeigen:  2");
                System.out.println("Anwendung beenden: 3");
                System.out.println("----------------------------------------------------------------------");
                eingabe = con.readLine();
                if ("1".equals(eingabe))
                {
                    System.out.println();
                    System.out.print("Bitte geben Sie den Termin ein: ");
                    datum = con.readLine();
                    System.out.print("Terminbeschreibung: ");
                    beschreibung = con.readLine();
                    error = terminpl.addTermin(datum, beschreibung);
                    if (error != 0) {
                        if (error == 1) {
                            System.out.println("Falsches Datumsformat!");
                        }
                        if (error == 2) {
                            System.out.println("Falsches Tagesformat!");
                        }
                        if (error == 3) {
                            System.out.println("Falsches Monatsformat!");
                        }
                        if (error == 4) {
                            System.out.println("Falsches Jahresformat!");
                        }
                        System.out.println("Termin nicht übernommen!");
                    }
                }
                if ("2".equals(eingabe))
                {
                    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
                   Iterator<Termin> itTermine = terminpl.getTermine().iterator();
                   while (itTermine.hasNext()) {
                       Termin t = itTermine.next();
                       System.out.println(sdf.format(t.getDatum()) + ", " + t.getBeschreibung());
                   }
                
                }
                if ("3".equals(eingabe))
                {
                    System.out.print("wirklich beenden (alle Eingaben gehen verloren) [ja/Nein]? ");
                    eingabe = con.readLine();
                    if (eingabe != null && eingabe.equalsIgnoreCase("ja")) {
                        break;
                    }
                }
            }
         }
     }
    
}

----------------------------------------NEUE KLASSE---------------------------------------------------------------------
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

public class Terminplaner {
    
    List<Termin> termine; 
    
    public Terminplaner() {
        termine = new ArrayList<Termin>();
    }
    
    public int addTermin(String datum, String beschreibung) {
        Calendar c = new GregorianCalendar();
        String[] datumteile = datum.split(".");
        if (datumteile.length != 3) {
            return 1;
        }
        if (datumteile[0].length() > 2) {
            return 2;
        }
        if (datumteile[1].length() > 2) {
            return 3;
        }
        if (datumteile[2].length() > 4) {
            return 4;
        }
        c.set(Integer.getInteger(datumteile[2]), Integer.getInteger(datumteile[1]), Integer.getInteger(datumteile[0]));
        
        termine.add(new Termin(c.getTime(),beschreibung));
        
        return 0;
    }
    
    public List<Termin> getTermine() {
        return termine;
    }

    public Termin getTermin(int ordinal) {
        if (ordinal < termine.size()) {
            return termine.get(ordinal);
        }
        return null;
    }
}
----------------------------------------NEUE KLASSE---------------------------------------------------------------------
import java.util.Date;

public class Termin {

    Date datum = null;
    
    String beschreibung = "";
    
    public Termin (){
        
    }
    
    public Termin (Date datum, String beschreibung){
        this.datum = datum;
        this.beschreibung = beschreibung;
    }

    public Date getDatum() {
        return datum;
    }

    public void setDatum(Date datum) {
        this.datum = datum;
    }

    public String getBeschreibung() {
        return beschreibung;
    }

    public void setBeschreibung(String beschreibung) {
        this.beschreibung = beschreibung;
    }

    
    
}
```


----------

