【问题标题】:Gregorian Calendar GUI - Problems公历 GUI - 问题
【发布时间】:2012-07-04 12:21:11
【问题描述】:

我必须为我的 Java 类制作一个功能齐全的日历,但我被卡住了。我使用GregorianCalendar 来获取当前日期、月份、年份等。我使用JButtons 来填充填写日历的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 swing user-interface gregorian-calendar


    【解决方案1】:

    我将解决程序的逻辑部分与 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);
    
    
       }
    }
    

    【讨论】:

    • 现在说得通了!非常感谢气垫船。
    【解决方案2】:

    除了@HFOE 的出色指导,以下建议可能会有所帮助:

    • 使用符合您要求的最高抽象级别。

      public static void main(String[] args) {
      
          Calendar cal = Calendar.getInstance();
          cal.set(2012, Calendar.JANUARY, 1);
          for (int j = 0; j < 24; j++) {
          ...
          }
      } 
      
    • 按照herehere 所示的模块化方式构建代码以构建组件和面板。

    • 使用event dispatch thread

    【讨论】:

    • 好的,是时候检查眼睛或增加 Aricept 的剂量了。我本可以发誓一小时前它不存在!
    • 注意,我只是将@HovercraftFullOfEels main() 的第一行替换为上面的两行并更新了导入。
    【解决方案3】:

    好的,一切正常,但我卡在 Prev 和 Next 按钮上。我有 ActionListener 设置,当我按下按钮时,它会分别打印到我的控制台 +1 或 -1 中,但日历没有刷新。我不确定我需要做些什么才能让这部分工作。这是我现在所拥有的......

    公共类日历扩展 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();
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多