//****************************************************************************** // Calendar.java: Applet // //****************************************************************************** import java.applet.*; import java.awt.*; import java.util.*; //============================================================================== // Main Class for applet Calendar // //============================================================================== public class Calendar extends Applet { Date datum; int m_monat, m_jahr; int[][] m_ausgabeMonat; CalendarMatrix calendarOutput; Font schrift; Label labelForMonth, labelForYear; Button incMonth, decMonth, incYear, decYear; public Calendar() {} public void init() { String param; datum = new Date(); // month: Uebergabe Monat //---------------------------------------------------------------------- param = getParameter("month"); if (param != null) m_monat = Integer.parseInt(param); else m_monat = datum.getMonth()+1; // year: Uebergabe Jahr //---------------------------------------------------------------------- param = getParameter("year"); if (param != null) m_jahr = Integer.parseInt(param); else m_jahr = datum.getYear()+1900; //Ausgabematrix erzeugen //---------------------------------------------------------------------- calendarOutput = new CalendarMatrix(m_monat,m_jahr); //Dialogelemente erstellen und einblenden //---------------------------------------------------------------------- schrift=new Font("Helvetica",Font.BOLD,14); labelForYear=new Label(String.valueOf(m_jahr)); labelForYear.setAlignment(Label.CENTER); labelForYear.setFont(schrift); labelForYear.resize(64,32); labelForMonth=new Label(" "+String.valueOf(m_monat)+" "); labelForMonth.setAlignment(Label.CENTER); labelForMonth.setFont(schrift); labelForMonth.resize(64,32); decMonth=new Button("<"); decMonth.reshape(5,5,20,20); decMonth.setBackground(Color.lightGray); incMonth=new Button(">"); incMonth.resize(32,32); incMonth.setBackground(Color.lightGray); decYear=new Button("<"); decYear.resize(32,32); decYear.setBackground(Color.lightGray); incYear=new Button(">"); incYear.resize(32,32); incYear.setBackground(Color.lightGray); this.add(decMonth,-1); this.add(labelForMonth,-1); this.add(incMonth,-1); this.add(decYear,-1); this.add(labelForYear,-1); this.add(incYear,-1); resize(256,256); } public void destroy() {} // Calendar Paint Handler //-------------------------------------------------------------------------- public void paint(Graphics g) { //Liniengrafik erstellen und ausgeben //---------------------------------------------------------------------- g.setColor(Color.black); for (int i=1; i<9; i++) { g.drawLine(0,i*32-1,255,i*32-1); } g.drawRect(0,0,255,255); g.drawLine(42,32,42,255); g.drawLine(44,32,44,255); schrift=new Font("Helvetica",Font.ITALIC,12); g.setFont(schrift); g.drawString("Mo",10, 52); g.drawString("Di",10, 84); g.drawString("Mi",10,116); g.drawString("Do",10,148); g.drawString("Fr",10,180); g.drawString("Sa",10,212); g.drawString("So",10,244); //Speziellen Monatskalender ausgeben //---------------------------------------------------------------------- schrift=new Font("Helvetica",Font.PLAIN,12); g.setFont(schrift); calendarOutput.outCalendarMatrix(g); } // Calendar Eventhandler //--------------------------------------------------------------------------- public boolean action(Event e,Object arj) { if (e.target==decMonth) { m_monat=calendarOutput.decMonth(); labelForMonth.setText(String.valueOf(m_monat)); this.repaint(); return true; } if (e.target==incMonth) { m_monat=calendarOutput.incMonth(); labelForMonth.setText(String.valueOf(m_monat)); this.repaint(); return true; } if (e.target==decYear) { m_jahr=calendarOutput.decYear(); labelForYear.setText(String.valueOf(m_jahr)); this.repaint(); return true; } if (e.target==incYear) { m_jahr=calendarOutput.incYear(); labelForYear.setText(String.valueOf(m_jahr)); this.repaint(); return true; } else return false; } public Color getBackground() { return Color.white; } } //****************************************************************************** // CalendarMatrix.class // //****************************************************************************** class CalendarMatrix { private int calx, caly, caldayspace; private int month, year; private int calmatrix[][]; // Konstruktor der Klasse CalendarMatrix public CalendarMatrix(int calmonth, int calyear) { calmatrix = new int[6][7]; month=calmonth; year=calyear; caldayspace=32; calx=64; caly=52; } // Interne Methoden // // Berechnung des Wochentages: Notwendig, da die Standard Java Methode Date.getDay() // entgegen der Java-Spezifikation von Sun !kein! Datum vor 1970 und nach 2037 berechnet // private int getWeekday(int i_year, int i_month, int i_day) { if (i_month<3) { i_month+=10; i_year-=1; } else { i_month-=2; } int y1 = i_year / 100; int y2 = i_year % 100; Double y3 = new Double(2.6 * i_month - 0.1); int dow = (i_day + y3.intValue() + y2 + (y2 / 4) + (y1 / 4) - (2 * y1) + 49) % 7; if (dow == 0) dow=7; return dow; } // // Besetzt die Elemente der Matrix mit den zum Monat passenden Daten // private void setCalMatrix(Graphics g) { int maxday=0; int day=1; int weekday=1; // Wieviele Tage besitzt der Monat? switch (month) { case 1 : maxday=31; break; case 2 : maxday=31; if ((double)year/4 == year/4) maxday=29; else maxday=28; break; case 3 : maxday=31; break; case 4 : maxday=30; break; case 5 : maxday=31; break; case 6 : maxday=30; break; case 7 : maxday=31; break; case 8 : maxday=31; break; case 9 : maxday=30; break; case 10 : maxday=31; break; case 11 : maxday=30; break; case 12 : maxday=31; break; } // Matrix wird mit den zum Monat gehörenden Werten belegt weekday = getWeekday(year,month,1); for (int x=0; x<6; x++) { for (int y=0; y<7; y++) { if ((x==0) && (weekday-1>y)) calmatrix[x][y]=0; else if (day>maxday) calmatrix[x][y]=0; else { calmatrix[x][y]=day; day = day+1; } } } } // Öffentliche Methoden // // Gibt den Inhalt der Matrix formatiert aus // public void outCalendarMatrix(Graphics g) { setCalMatrix(g); for (int x=0; x<6; x++) { for (int y=0; y<7; y++) { if (calmatrix[x][y]>9) g.drawString((new Integer(calmatrix[x][y]).toString()), (caldayspace*x)+calx, (caldayspace*y)+caly); else if (calmatrix[x][y]>0) g.drawString((new Integer(calmatrix[x][y]).toString()), (caldayspace*x)+calx+6, (caldayspace*y)+caly); } } } // // Die folgenden Methoden In- bzw. Dekrementieren den Monat bzw das Jahr // unter Berücksichtigung der Grenzen 1-12 für den Monat bzw 1901-2099 für das Jahr // public int incMonth() { if (month<12) month = month+1; return(month); } public int decMonth() { if (month>1) month = month-1; return(month); } public int incYear() { if (year<2099) year = year+1; return(year); } public int decYear() { if (year>1901) year = year-1; return(year); } }