2012-07-04 1 views
3

Мне нужно сделать полнофункциональный календарь для моего участия в классе Java, и я застрял. Я использую GregorianCalendar, чтобы получить текущий день, месяц, год и т. Д. Я использую JButton s для заполнения 42 полей, заполняющих календарь, и имеющих дни месяца для каждого человека JButton. У меня проблема с получением первого дня месяца (июль), чтобы попасть в правильный JButton. Календарь признает месяц как июль, а год - 2012 годом, но он помещает 1-е место в понедельник вместо воскресенья и отключается на одну неделю. Вот мой код, спасибо за любую помощь!Григорианский календарь GUI - Проблемы

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

ответ

2

Я бы решил использовать логическую часть вашей программы отдельно от части графического интерфейса пользователя, а затем использовать логическую часть. Я бы использовал 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); 


    } 
} 
+0

Это имеет смысл сейчас Большое спасибо на воздушной подушке. –

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++) { 
        ... 
        } 
    } 
    
  • Структура код для создания компонентов и панелей модульным способом, как показано here и here.

  • Используйте event dispatch thread.

+0

ОК, время, чтобы проверить глаза или увеличить дозу Aricept. Я мог бы поклясться, что этого не было еще час назад! –

+0

Обратите внимание: я просто заменил первую строку @HovercraftFullOfEels 'main()' двумя строками выше и обновил импорт. – trashgod

+0

О да, это имеет большое значение ... спасибо! –

0

Хорошо, все работает, но я застрял на кнопках 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(); 
} 

}