0

// Swing でカスタム jcalender を作成しています

//日付設定に関する問題に直面しています //つまり、実際の月は火曜日から始まり、水曜日から始まります //カレンダーモデルの値の設定に関する問題を見つけています

//上記のコードは正常に動作していますが、実際の日付の表示に問題があります //必要な変更を行うよう提案してください

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

}
4

3 に答える 3

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

コンボ ボックス内にリストされているものと一致する結果は生成されません。たとえば、最初の値を選択すると19982008

したがって、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に使用するように修正する必要があります20081998

于 2013-11-18T06:05:56.137 に答える
1

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);
于 2013-11-18T05:57:19.657 に答える
0

これを試してください.. オフセット計算で-1 の代わりに-2を使用してください。

 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;
于 2013-11-18T06:01:41.030 に答える