3

I have to make a fully function calendar for my into to Java class and I am stuck. I am using GregorianCalendar to get the current day, month, year, etc. I am using JButtons to populate the 42 fields that fill out the calendar, and having the days of the month post on each individual JButton. I am having a problem getting the first day of the month (July) to fall in the correct JButton. The calendar is recognizing the month as July, and the year as 2012, but it's putting the 1st on Monday instead of Sunday, and is off by one week. Here is my code, thanks for any help!

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.GregorianCalendar;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Calendar extends JFrame {

    public Calendar() {
        this.setSize(800, 600);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setVisible(true);
        this.setTitle("Calendar");

        JPanel borderPanel = new JPanel();
        borderPanel.setLayout(new BorderLayout());
        getContentPane().add(borderPanel);

        // Initialize GregorianCalendar
        GregorianCalendar cal = new GregorianCalendar();
        int currYear = cal.get(GregorianCalendar.YEAR);
        int currDOM = cal.get(GregorianCalendar.DAY_OF_MONTH);
        int currMnth = cal.get(GregorianCalendar.MONTH);
        String month2 = "";
        switch (currMnth) {
            case 0:
                month2 = "January";
                break;
            case 1:
                month2 = "February";
                break;
            case 2:
                month2 = "March";
                break;
            case 3:
                month2 = "April";
                break;
            case 4:
                month2 = "May";
                break;
            case 5:
                month2 = "June";
                break;
            case 6:
                month2 = "July";
                break;
            case 7:
                month2 = "August";
                break;
            case 8:
                month2 = "September";
                break;
            case 9:
                month2 = "October";
                break;
            case 10:
                month2 = "November";
                break;
            case 11:
                month2 = "December";
                break;
        }
        int nod, som;
        nod = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH); //Number of Days
        som = cal.get(GregorianCalendar.DAY_OF_WEEK_IN_MONTH); // Start of the Month

        // Button Layout
        final int ROWS = 6;
        final int COLS = 7;
        JButton[][] days;
        JPanel calendar = new JPanel();
        calendar.setLayout(new GridLayout(6, 7));
        days = new JButton[ROWS][COLS];
        for (int row = 0; row < ROWS; row++) {
            for (int col = 0; col < COLS; col++) {
                days[row][col] = new JButton("");
                calendar.add(days[row][col]);
            }
        }

        // Add Some Number to the Buttons
        int[] tableMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int startDay = som;
        int daysInMonth = tableMonth[currMnth];
        for (int i = 0; i < daysInMonth; i++) {
            days[(startDay + i) / 7][(startDay + i) % 7].setText("" + (i + 1));
        }
        borderPanel.add(calendar, BorderLayout.CENTER);

        // North Panel - Current Month / Prev & Next Button
        JPanel month = new JPanel();
        month.add(new JButton("Previous"));
        month.add(new JLabel(month2));
        month.add(new JButton("Next"));
        borderPanel.add(month, BorderLayout.NORTH);

        // West Panel - Current Date
        JPanel year = new JPanel();
        year.add(new JButton("The Year is: " + currYear));
        borderPanel.add(year, BorderLayout.SOUTH);

        // South Panel - Current Year
        JPanel today = new JPanel();
        today.add(new JButton("Today is: " + month2 + " " + currDOM + ", " + currYear));
        borderPanel.add(today, BorderLayout.WEST);

    }

    public static void main(String[] args) {
        new Calendar();
    }
}
Mat
  • 202,337
  • 40
  • 393
  • 406
Mark Wilkins
  • 41
  • 2
  • 3

3 Answers3

3

I would solve for the logical portion of your program separate from the GUI portion, then use the logical portion. I would use a SimpleDateFormat to get my special calendar Strings such as the month and day of week Strings. For example:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class MyCalendar {
   private static final SimpleDateFormat MONTH_FORMAT = new SimpleDateFormat("MMMM");
   private static final SimpleDateFormat DAY_OF_WEEK_FORMAT = new SimpleDateFormat("EEEE");
   private static final SimpleDateFormat MY_DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy");

   public static void main(String[] args) {


      GregorianCalendar cal = new GregorianCalendar(2012, Calendar.JANUARY, 1);
      for (int j = 0; j < 24; j++) {
         Date date = cal.getTime();
         System.out.println("Date: " + MY_DATE_FORMAT.format(date));
         int year = cal.get(Calendar.YEAR);
         System.out.println("year := " + year);
         int month = cal.get(Calendar.MONTH);
         System.out.printf("month number: %d, month name: %s%n", month, MONTH_FORMAT.format(date));
         int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
         System.out.printf("day of week: %d, day of week string: %s%n", dayOfWeek, DAY_OF_WEEK_FORMAT.format(date));

         int maxDaysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
         System.out.println("maxDaysInMonth := " + maxDaysInMonth);
         cal.add(Calendar.MONTH, 1);
         System.out.println();
      }

      System.out.println("Today!");
      cal = new GregorianCalendar(); // today!
      Date date = cal.getTime();
      System.out.println("Date: " + MY_DATE_FORMAT.format(date));
      int year = cal.get(Calendar.YEAR);
      System.out.println("year := " + year);
      int month = cal.get(Calendar.MONTH);
      System.out.printf("month number: %d, month name: %s%n", month, MONTH_FORMAT.format(date));
      int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
      System.out.printf("day of week: %d, day of week string: %s%n", dayOfWeek, DAY_OF_WEEK_FORMAT.format(date));

      int maxDaysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
      System.out.println("maxDaysInMonth := " + maxDaysInMonth);
      cal.add(Calendar.MONTH, 1);


   }
}
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
2

In addition to @HFOE's excellent guidance, the following suggestions may be helpful:

  • Use the highest level of abstraction consistent with your requirements.

    public static void main(String[] args) {
    
        Calendar cal = Calendar.getInstance();
        cal.set(2012, Calendar.JANUARY, 1);
        for (int j = 0; j < 24; j++) {
        ...
        }
    } 
    
  • Structure your code to build components and panels in a modular way as shown here and here.

  • Use the event dispatch thread.

Community
  • 1
  • 1
trashgod
  • 203,806
  • 29
  • 246
  • 1,045
0

Okay, everything is working but I am stuck on the Prev and Next buttons. I have the ActionListener setup, and when I push the buttons it'll print into my console +1 or -1 respectively, but the calendar isn't refreshing. I'm not sure what I need to do to get that part too work. Here is what I have now...

public class Calendar extends JFrame {

static JButton btnNext, btnPrev;
static int currYear, currDOM, currentMonth;

public Calendar() {
    this.setSize(800,600);
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    this.setVisible(true);
    this.setTitle("Calendar");


    JPanel borderPanel = new JPanel();
    borderPanel.setLayout(new BorderLayout());
    getContentPane().add(borderPanel);

    // Initialize GregorianCalendar
    GregorianCalendar cal = new GregorianCalendar();
    int currYear = cal.get(GregorianCalendar.YEAR);
    int currDOM = cal.get(GregorianCalendar.DAY_OF_MONTH);
    int currMnth = cal.get(GregorianCalendar.MONTH);
    currentMonth = currMnth;
    String StringMnth = "";
        switch(currMnth) {
        case 0: StringMnth = "January"; break;
        case 1: StringMnth = "February"; break;
        case 2: StringMnth = "March"; break;
        case 3: StringMnth = "April"; break;
        case 4: StringMnth = "May"; break;
        case 5: StringMnth = "June"; break;
        case 6: StringMnth = "July"; break;
        case 7: StringMnth = "August"; break;
        case 8: StringMnth = "September"; break;
        case 9: StringMnth = "October"; break;
        case 10: StringMnth = "November"; break;
        case 11: StringMnth = "December"; break;
    }
    int nod, som;
    cal.set(GregorianCalendar.DATE, 1);
    nod = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH); //Number of Days
    som = (cal.get(GregorianCalendar.DAY_OF_WEEK) - GregorianCalendar.SUNDAY + 7)%7; // Start of the Month

    // Button Layout
    final int ROWS = 6;
    final int COLS = 7;
    JButton[][] days;
    JPanel calendar = new JPanel();
    calendar.setLayout(new GridLayout(6,7));
    days = new JButton[ROWS][COLS];
    for(int row = 0; row < ROWS; row++) {
        for(int col = 0; col < COLS; col++) {
            days[row][col] = new JButton("");
            calendar.add(days[row][col]);
        }
    }

    // Add Some Number to the Buttons
    int[] tableMonth = {31,28,31,30,31,30,31,31,30,31,30,31};
    int startDay = som;
    int daysInMonth = tableMonth[currMnth];
    for(int i = 0; i < daysInMonth; i++){
        days[(startDay + i)/7][(startDay + i) % 7].setText("" + (i + 1));
    }
    borderPanel.add(calendar, BorderLayout.CENTER);

    // North Panel - Current Month / Prev & Next Button
    btnNext = new JButton(">>");
    btnPrev = new JButton("<<");
    JPanel month = new JPanel();    
    month.add(btnPrev);
    month.add(new JLabel(StringMnth));
    month.add(btnNext);
    borderPanel.add(month, BorderLayout.NORTH);

    //Listeners
    btnPrev.addActionListener(new btnPrev_Action());
    btnNext.addActionListener(new btnNext_Action());

    // West Panel - Current Date
    JPanel year = new JPanel();
    year.add(new JButton("The Year is: " + currYear ));
    borderPanel.add(year, BorderLayout.SOUTH);

    // South Panel - Current Year
    JPanel today = new JPanel();
    today.add(new JButton("Today is: " + StringMnth + " " + currDOM + ", " + currYear));
    borderPanel.add(today, BorderLayout.WEST);

}

static class btnNext_Action implements ActionListener{
    public void actionPerformed (ActionEvent e){
        currentMonth += 1;
        System.out.print(currentMonth);
    }
}

static class btnPrev_Action implements ActionListener{
    public void actionPerformed (ActionEvent e){
        currentMonth -= 1;
        System.out.print(currentMonth);
    }
}
public static void main(String[] args) {
    new Calendar();
}

}

Mark Wilkins
  • 41
  • 2
  • 3