Gregorian Calendar

  • Themenstarter Themenstarter Java_Neuling
  • Beginndatum Beginndatum
J

Java_Neuling

Hi!

Ich programmiere gerade an der Kalender Funktion von Java rum und habe dafür den Gregorian Calendar benutzt. Als ich dann die Abfrage nach dem Jahr machte kam ne Fehlermeldung index.out.of.BoundsException obwohl an der Stelle gar kein Array steht. Der Fehler kann nur in der Zeile liegen...
Ist irgendwas über Fehler bei dem Gregorian Calendar bekannt?

Danke im voraus für die Posts!

MfG
Java_Neuling
 
Hi!

Java:
package RZMP;

public class Kalender{
	public static void main(String [] args){
		Layout layout = new Layout();
		
		layout.anzeigen();
	}
}

Java:
package RZMP;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class Datum{
	
	public GregorianCalendar cal = new GregorianCalendar();
	
	public void setTimeZone(){
		cal.setTimeZone( TimeZone.getTimeZone("ECT") );
	}
	
	public int berechneTage(){
	    return cal.get( cal.get(Calendar.DAY_OF_MONTH) );
	}
	
	public int berechneMonat(){
		return cal.get( cal.get(Calendar.MONTH) );
	}
		
	public int berechneJahr(){
		//System.out.println( cal.get( cal.get(Calendar.YEAR) ) );
		return cal.get( cal.get(Calendar.YEAR) );
	}
	
	public int berechneKW(){
		return cal.get( Calendar.WEEK_OF_YEAR );
	}

}

Java:
package RZMP;

import java.awt.Container;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Layout {
	public JFrame frame = new JFrame("Kalender");			/*Fenster für die Anzeige*/
	public JTextField tf_anzeige[] = new JTextField[2];		/*TextFeld für die Auswahl des Jahres und Monats*/
	public JButton bt_woTage[] = new JButton[7];			/*JLabel für die Anzeige der Wochentage (Mo, Di, Mi, ...)*/
	public JButton bt_kw[] = new JButton[5];				/*JLabel für die Anzeige der KalenderWoche*/
	public JButton bt_tage[] = new JButton[31];				/*JButton für die Anzeige der Tage des Monats*/
	public JButton bt_pfeile[] = new JButton[4];			/*JButton zum Weiterschalten von Jahr und Monat*/
	public Datum berechner = new Datum();
	public int pos_x = 85;
	public int pos_y = 60;
	public int breite = 60;
	public int höhe = 60;
	
	public void anzeigen(){		
	    Container c = frame.getContentPane();
	    c.setLayout( null );
		
		/*Füllen des WochenTage Arrays*/
		for(int bt = 0; bt < bt_woTage.length; bt++){
			bt_woTage[bt] = new JButton();
		}
		
		bt_woTage[0].setText("MO");
		bt_woTage[1].setText("DI");
		bt_woTage[2].setText("MI");
		bt_woTage[3].setText("DO");
		bt_woTage[4].setText("FR");
		bt_woTage[5].setText("SA");
		bt_woTage[6].setText("SO");
		
		/*Eigenschaften der TextFelder*/
		int monat = berechner.berechneMonat();
		int jahr = berechner.berechneJahr();
		
		for(int tf = 0; tf < tf_anzeige.length; tf++){
			tf_anzeige[tf] = new JTextField();
			tf_anzeige[tf].setEditable(false);
			c.add(tf_anzeige[tf]);
		}

	    tf_anzeige[0].setBounds		( 70, 10,100, 20);
	    tf_anzeige[0].setText("2008");
		tf_anzeige[1].setBounds		(405, 10,100, 20);
		
		
		if(monat == 0){
			tf_anzeige[1].setText("Januar");
		} else if(monat == 1){
			tf_anzeige[1].setText("Februar");
		} else if(monat == 2){
			tf_anzeige[1].setText("März");
		} else if(monat == 3){
			tf_anzeige[1].setText("April");
		} else if(monat == 4){
			tf_anzeige[1].setText("Mai");
		} else if(monat == 5){
			tf_anzeige[1].setText("Juni");
		} else if(monat == 6){
			tf_anzeige[1].setText("Juli");
		} else if(monat == 7){
			tf_anzeige[1].setText("August");
		} else if(monat == 8){
			tf_anzeige[1].setText("September");
		} else if(monat == 9){
			tf_anzeige[1].setText("Oktober");
		} else if(monat == 10){
			tf_anzeige[1].setText("November");
		} else{
			tf_anzeige[1].setText("Dezember");
		};
		
		
		/*Füllen des Pfeil Arrays*/
		for(int bt = 0; bt < bt_pfeile.length; bt++){
			bt_pfeile[bt] = new JButton();
			c.add(bt_pfeile[bt]);
		}
		
		bt_pfeile[0].setText("<");							/*Zurück Schalten vom Jahr*/
		bt_pfeile[1].setText(">");							/*Vor Schalten vom Jahr*/
		bt_pfeile[2].setText("<");							/*Zurück Schalten vom Monat*/
		bt_pfeile[3].setText(">");							/*Vor Schalten vom Monat*/
			
		bt_pfeile[2].setBounds		( 10, 10, 50, 20);
		bt_pfeile[3].setBounds		(180, 10, 50, 20);
		bt_pfeile[0].setBounds		(345, 10, 50, 20);
		bt_pfeile[1].setBounds		(515, 10, 50, 20);
		
					    
	    /*Ausgabe der Tage*/
	    for(int tag = 0; tag < bt_woTage.length; tag++){
	    	bt_woTage[tag].setBounds	  ( pos_x, pos_y, breite, höhe );
	    	
	    	pos_x = pos_x + pos_y + 10;
	    	c.add(bt_woTage[tag]);
	    }
	    
		/*Eigenschaften des Fenster*/
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.setResizable(true);
		frame.setSize(590, 300);
		frame.setVisible(true);
	}
	
	public void positionen(){
		pos_x = 90;
	    pos_y = 80;
	    breite = 60;
	    höhe = 60;
	}
}

Als Fehlermeldung kommt:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2008
at java.util.Calendar.internalGet(Unknown Source)
at java.util.Calendar.get(Unknown Source)
at RZMP.Datum.berechneJahr(Datum.java: 25)
at RZMP.Layout.anzeigen(Layout.java:41)
at RZMP.Kalender.main(Kalender.java: 7)


MfG
Java_Neuling
 
Zuletzt bearbeitet von einem Moderator:
Moin!
Statt
Code:
return cal.get( cal.get(Calendar.YEAR));

solltest du es eher
Code:
return cal.get(Calendar.YEAR));
so machen.. Und nicht nur beim Jahr, sondern auch gleich die anderen Felder berücksichtigen..

*grüssle*
MeinerEiner
 
Hi!

Vielen Vielen Dank :D endlich klappts!

Ich beschäftige mich erst seit neuem mit der Kalender Klasse darum ist mir der Fehler nicht aufgefallen... :(

Nochmals vielen Dank!

MfG
Java_Neuling
 
Was ich vergessen habe:
Statt der ganzen if-Abfragen, bezüglich der Ausgabe des Monats in deinem Textfeld, würde es auch folgender Einzeiler regeln:
Code:
System.out.println(cal.getDisplayName(Calendar.MONTH,Calendar.LONG,Locale.GERMAN));

*grüssle*
MeinerEiner
 
Hey,

vielen Dank :) so ists viel einfacher :D

ich muss gestehen wir fangen gerade erst mit der Objekt Orientierten Programmierung an fällt dir da vllt was auf in dem Code:confused: Oder könnte man es so lassen? :D:D:D

Grüße
Java_Neuling
 
Moin!
Naja wenn du mich schon so fragst ;) Wieso schreibst du denn direkt "2008" in das Textfeld und holst dir den Wert nicht aus dem Kalendar?
Die Wochentage kann man sich ebenso leicht über die Methode getDisplayNames() des Calendar Objekts holen.
Ein Null-Layout würde ich auch nur im äussersten Notfall nutzen, LayoutManager sind da besser geeingnet.
Und wenn die Datumsklasse auf diese Funktionalität beschränkt bleibt, ist sie meiner Meinung nach unnötig. Da hätte man auch der Layout Klasse ein Kalender Objekt zuweisen können..

Manches davon ist eh Geschmackssache. Das wirst du mit der Zeit selber lernen..

*grüssle*
MeinerEiner
 
Hi,

erst mal Danke für deine Tips!
Das mit dem 2008 war nur für Test zwecke wo ich den Fehler (mit cal.get...) gesucht habe. Das wurde schon wieder geändert ;)
Das mit den Wochentagen probier ich gleich mal aus :D und mit dem Layout es ist halt so das ich die Buttons mit einem bestimmten abstand zueinander positionieren will und wenn ich einen Layout Manager nehme ist der Abstand der Buttons voneinander fest vorgegeben (zumindest bei denen die ich bis jetzt benutzt habe...)

Ne andere Frage wie du gesehen hast hab ich ja zwei Textfelder in denen das Jahr und der Monat drin steht. Ich möchte durch diese TextFelder die anfallenden Tage (28, 30, 31) drunter ausgeben lassen. Ich hab leider nur noch keine Ahnung wie ich ne Beziehung zwischen den Textfeldern und der Ausgabe herstellen kann :confused:
vllt macht es ja ein Beispiel klarer 13.März.2008 ist ein Donnerstag also soll ein Button mit dem Text "13" erzeugt werden und unter dem Donnerstag stehen. Dies soll für alle Tage im Monat gemacht werden je nach dem welcher Monat ausgewählt ist. Dadurch kommen wir auch schon zum nächsten Problem ich hab keine Ahnung wie ich die Monate weiterschalten lassen soll wenn ich nur Abfrage in welchem Monat ich mich gerade befinde :confused:

Ich hoffe ich hab mich klar genug ausgedrückt :(

MfG
Java_Neuling
 
Ich möchte durch diese TextFelder die anfallenden Tage (28, 30, 31) drunter ausgeben lassen. Ich hab leider nur noch keine Ahnung wie ich ne Beziehung zwischen den Textfeldern und der Ausgabe herstellen kann :confused:
Wenn ich dich richtig verstehe und du wissen willst, wieviele Tage ein Monat maximal hat, erhält man das leicht mittels:
Code:
System.out.println(cal.getActualMaximum(Calendar.DAY_OF_MONTH));
Du solltest auch mal ein bisschen in der API stöbern. Wenn man sich das ordentlich zu Gemüte führt, findet man das alles selbst leicht raus.

ich hab keine Ahnung wie ich die Monate weiterschalten lassen soll wenn ich nur Abfrage in welchem Monat ich mich gerade befinde :confused:
Wenn du dich beispielsweise im März befindest und den Kalender auf April setzen willst.. nun dafür gibt es set() und add() Methoden, mit dem man die Datumsfelder des Kalenders setzen kann.. Einfach mal nachschauen...

*grüssle*
MeinerEiner
 
Zurück