Java 公历图形用户界面-问题

Java 公历图形用户界面-问题,java,swing,user-interface,gregorian-calendar,Java,Swing,User Interface,Gregorian Calendar,我必须为我的into-to-Java类制作一个功能齐全的日历,我被卡住了。我使用gregoriacalendar获取当前日期、月份、年份等。我使用JButtons填充42个填写日历的字段,并在每个JButton上张贴月份的日期。我在将每月的第一天(7月)设置为正确的JButton时遇到问题。日历将月份识别为7月,将年份识别为2012年,但它将1号放在周一而不是周日,并将其推迟一周。这是我的代码,谢谢你的帮助 import java.awt.BorderLayout; import java.aw

我必须为我的into-to-Java类制作一个功能齐全的日历,我被卡住了。我使用
gregoriacalendar
获取当前日期、月份、年份等。我使用
JButton
s填充42个填写日历的字段,并在每个
JButton
上张贴月份的日期。我在将每月的第一天(7月)设置为正确的
JButton
时遇到问题。日历将月份识别为7月,将年份识别为2012年,但它将1号放在周一而不是周日,并将其推迟一周。这是我的代码,谢谢你的帮助

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();
    }
}
导入java.awt.BorderLayout;
导入java.awt.GridLayout;
导入java.util.GregorianCalendar;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
公共类日历扩展JFrame{
公历(){
这个。设置大小(800600);
此.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
此.setVisible(true);
本文件的标题为“日历”;
JPanel borderPanel=新的JPanel();
setLayout(新的BorderLayout());
getContentPane().add(borderPanel);
//初始化gregorianalendar
GregorianCalendar cal=新的GregorianCalendar();
int currYear=cal.get(格里高利安日历年);
int currDOM=cal.get(格里高利安日历月日);
int currMnth=cal.get(gregorianalendar.MONTH);
字符串month2=“”;
开关(电流){
案例0:
month2=“一月”;
打破
案例1:
month2=“二月”;
打破
案例2:
month2=“三月”;
打破
案例3:
month2=“四月”;
打破
案例4:
month2=“五月”;
打破
案例5:
month2=“六月”;
打破
案例6:
month2=“7月”;
打破
案例7:
month2=“八月”;
打破
案例8:
month2=“9月”;
打破
案例9:
month2=“十月”;
打破
案例10:
month2=“11月”;
打破
案例11:
month2=“12月”;
打破
}
int nod,som;
nod=cal.getActualMaximum(GregorianCalendar.DAY,OF,OF,OF,MONTH);//天数
som=cal.get(GregorianCalendar.DAY,OF,OF,WEEK,IN,MONTH);//月初
//按钮布局
最终整数行=6;
最终整数COLS=7;
JButton[][]天;
JPanel calendar=新的JPanel();
calendar.setLayout(新的GridLayout(6,7));
天=新的JButton[行][COLS];
对于(int row=0;row
我会将程序的逻辑部分与GUI部分分开,然后使用逻辑部分。我将使用SimpleDateFormat来获取我的特殊日历字符串,例如月和星期几字符串。例如:

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);


   }
}
import java.text.simpleDataFormat;
导入java.util.Calendar;
导入java.util.Date;
导入java.util.GregorianCalendar;
公共类MyCalendar{
私有静态最终SimpleDataFormat月_格式=新SimpleDataFormat(“MMMM”);
私有静态最终简化格式日周格式=新简化格式(“EEEE”);
私有静态最终SimpleDataFormat MY_DATE_格式=新SimpleDataFormat(“MM/dd/yyyy”);
公共静态void main(字符串[]args){
GregorianCalendar cal=新的GregorianCalendar(2012年,日历1月1日);
对于(int j=0;j<24;j++){
Date-Date=cal.getTime();
System.out.println(“日期:+MY_Date_FORMAT.FORMAT(日期));
int year=cal.get(日历年);
System.out.println(“年:=”+年);
int month=cal.get(日历月);
System.out.printf(“月号:%d,月名:%s%n”,月,月格式(日期));
int dayOfWeek=cal.get(日历。每周的第几天);
System.out.printf(“星期日:%d,星期日字符串:%s%n”,星期日,星期日格式(日期));
int maxDaysInMonth=cal.getActualMaximum(日历,每月的第天);
System.out.println(“maxDaysInMonth:=”+maxDaysInMonth);
计算添加(日历月,1);
System.out.println();
}
System.out.println(“今天!”);
cal=新的Gregorianalendar();//今天!
Date-Date=cal.getTime();
public static void main(String[] args) {

    Calendar cal = Calendar.getInstance();
    cal.set(2012, Calendar.JANUARY, 1);
    for (int j = 0; j < 24; j++) {
    ...
    }
} 
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();
}