2013-11-18 3 views
0

// Я создаю настроить jcalender свингомJcalender в Swing, Java

// Я перед проблемой относительно даты установить // т.е. фактический месяц начинается с вторником, он начинает со среды // Я найти проблему относительно значений настроек в каландр-модели

// Над код работает нормально, но проблема в показывая фактические даты // пожалуйста, предложите мне сделать необходимые изменения

import java.awt.Color; 


public class Calendar extends JFrame { 

    private JPanel contentPane; 

    String[] years = { "2008", "2009", "2010" ,"2011","2012","2013","2014"}; 

     JComboBox comboBox = new JComboBox(years); 

     String[] months = { "January", "February", "March", "April", "May", "June", "July", "August", 
      "September", "October", "November", "December" }; 

     JList list = new JList(months); 

     JScrollPane scrollPane = new JScrollPane(list); 

     CalendarModel model = new CalendarModel(); 

     JTable table = new JTable(model); 

     public Calendar() { 
      super(); 

      getContentPane().setLayout(null); 
      comboBox.setBounds(10, 10, 100, 30); 
      comboBox.setSelectedIndex(5); 
      comboBox.addItemListener(new ComboHandler()); 
      scrollPane.setBounds(200, 10, 150, 100); 
      list.setSelectedIndex(10); 
      list.addListSelectionListener(new ListHandler()); 
      table.setBounds(10, 150, 550, 200); 
      model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex()); 
      getContentPane().add(comboBox); 
      getContentPane().add(scrollPane); 
      table.setGridColor(Color.black); 
      table.setShowGrid(true); 
      getContentPane().add(table); 

      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      setSize(530,300); 
      setVisible(true); 


      } 


    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Calendar frame = new Calendar(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public class ComboHandler implements ItemListener { 
     public void itemStateChanged(ItemEvent e) { 
      System.out.println("ItemState change Method called "); 
      model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex()); 
      table.repaint(); 
     } 
     } 

     public class ListHandler implements ListSelectionListener { 
     public void valueChanged(ListSelectionEvent e) { 
      model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex()); 
      table.repaint(); 
     } 
     } 
    } 
    class CalendarModel extends AbstractTableModel { 
     String[] days = { "Sun" , "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; 

     int[] numDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 

     String[][] calendar = new String[7][7]; 

     public CalendarModel() { 

      //setting name of days (mon,tues) 
     for (int i = 0; i < days.length; ++i) 
     { 
      System.out.println("day[i] *** "+days[i]); 
      calendar[0][i] = days[i]; 

     } 
     for (int i = 1; i < 7; ++i){ 
      for (int j = 0; j < 7; ++j) 
      { 
       System.out.println("calendar[i][j] value i ** "+i +" j value "+ j); 
      calendar[i][j] = " "; 
      } 
     } 

     } 

     public int getRowCount() { 
     return 7; 
     } 

     public int getColumnCount() { 
     return 7; 
     } 

     public Object getValueAt(int row, int column) { 
      System.out.println("get Value at ** "+calendar[row][column]); 
     return calendar[row][column]; 
     } 

     /* 
     public void setValueAt(Object value, int row, int column) { 
      System.out.println("set Value at ** "+(String) value); 
     calendar[row][column] = (String) value; 
     }*/ 

     public void setMonth(int year, int month) { 
     for (int i = 1; i < 7; ++i) 
     { 
      for (int j = 0; j < 7; ++j) 
      { 
      calendar[i][j] = " "; 
      } 
     } 
     java.util.GregorianCalendar cal = new java.util.GregorianCalendar(); 
     cal.set(year, month, 1); 
     int offset = cal.get(java.util.GregorianCalendar.DAY_OF_WEEK) - 1; 
     offset += 7; 
     int num = daysInMonth(year, month); 
     for (int i = 0; i < num; ++i) { 
      System.out.println("offset *** "+Integer.toString(i+1)); 
      calendar[offset/7][offset % 7] = Integer.toString(i+1); 
      ++offset; 
     } 
     } 

     public boolean isLeapYear(int year) { 
      System.out.println("Is Leap Year *** "); 
     if (year % 4 == 0) 
      return true; 
     return false; 
     } 

     public int daysInMonth(int year, int month) { 
      System.out.println("day In month*** "); 
     int days = numDays[month]; 
     if (month == 1 && isLeapYear(year)) 
      ++days; 
     System.out.println("days *** "+days); 
     return days; 
     } 

} 
+1

пожалуйста, и ваш вопрос ???, интересные 5 upvotes на вопрос без какого-либо вопроса внутри – mKorbel

ответ

1

H пр попробовать с этим в setMonth методом

public void setMonth(int year, int month) 

Изменить

calendar[offset/7][offset % 7] = Integer.toString(i+1); 

Для

calendar[offset/7][offset % 7] = Integer.toString(i+2); 
0

попробовать это .. использовать - 2 вместо - 1 в расчете смещения.

java.util.GregorianCalendar cal = new java.util.GregorianCalendar(); 
    cal.set(year, month, 1); 
    int offset = cal.get(java.util.GregorianCalendar.DAY_OF_WEEK)- 2 ; 
    offset += 7; 
    int num = daysInMonth(year, month); 
    for (int i = 0; i < num; ++i) { 
     System.out.println("offset *** "+Integer.toString(i+1)); 
     calendar[offset/7][offset % 7] = Integer.toString(i+1); 
     ++offset; 
+0

Я попытался заменить смещение - 1 до -2, но его заменяя день недели в субботу в колонке, пожалуйста, предоставьте мне предложения –

2

Я не знаю, если это связано, но ...

public void itemStateChanged(ItemEvent e) { 

    int index = comboBox.getSelectedIndex(); 
    System.out.println("index = " + index + "; " + (index + 1998)); 

    model.setMonth(comboBox.getSelectedIndex() + 1998, list.getSelectedIndex()); 
    table.repaint(); 
} 

не дает результатов, которые соответствуют тем, которые перечислены в поле со списком. Например, если вы выбрали первое значение, оно будет равно 1998, а не 2008

Так что, если я выбираю 2013 из выпадающего списка, на самом деле я получаю 2003.

Когда я изменил его на

public void itemStateChanged(ItemEvent e) { 

    int index = comboBox.getSelectedIndex(); 
    System.out.println("index = " + index + "; " + (index + 2008)); 

    model.setMonth(comboBox.getSelectedIndex() + 2008, list.getSelectedIndex()); 
    table.repaint(); 
} 

Он дал мне лучшие результаты.

Я также изменил

java.util.GregorianCalendar cal = new java.util.GregorianCalendar(); 

в

java.util.Calendar cal = java.util.Calendar.getInstance(); 

Вы должны избегать делать предположения о календарном пользователей системы, если это возможно ...

Я также избежать null макетов, а также ;)

Вы также должны избегать вызова table.repaint при изменении модели таблицы, вместо того, чтобы попытаться использовать fireTableDataChanged внутри метода setMonth

Я, лично, добавить слушателей выпадающий список и JList перед установкой там выбранных индексов, это позволит слушателям обновить модель вы...

Вам также нужно исправить вам ListHandler так, что он использует 2008 вместо 1998

+0

+1 избегая описания NullLayout и JTable, но я думаю (совершенно уверен), что у всех хороших Java-календарей нет никаких проблем с .... – mKorbel