JAVA日曆

效果圖以下:java

  1 import java.awt.*;
  2 import java.awt.event.*;
  3 import java.util.*;
  4 
  5 import javax.swing.*;
  6 import javax.swing.event.*;
  7 import javax.swing.table.*;
  8 
  9 public class MyCalendar extends JApplet
 10 {
 11     //定義星期天到星期六
 12     public static final String WEEK_SUN = "週日";
 13     public static final String WEEK_MON = "週一";
 14     public static final String WEEK_TUE = "週二";
 15     public static final String WEEK_WED = "週三";
 16     public static final String WEEK_THU = "週四";
 17     public static final String WEEK_FRI = "週五";
 18     public static final String WEEK_SAT = "週六";
 19     //設置背景顏色
 20     public static final Color background  = Color.white;
 21     //設置前景顏色
 22     public static final Color foreground  = Color.black;
 23     //設置題頭星期的背景顏色和前景顏色
 24     public static final Color headerBackground  = Color.blue;
 25     public static final Color headerForeground  = Color.white;
 26     //設置被選中的日期的背景顏色和前景顏色
 27     public static final Color selectedBackground  = Color.red;
 28     public static final Color selectedForeground  = Color.white;
 29 
 30     private JPanel cPane;
 31     private JLabel yearsLabel;//
 32     private JSpinner yearsSpinner;//年調控
 33     private JLabel monthsLabel;//
 34     private JComboBox monthsComboBox;//月下拉框
 35     private JTable daysTable;//用來顯示日期的table
 36     private AbstractTableModel daysModel;
 37     private Calendar calendar;
 38     //構造方法初始化panel
 39 
 40     public MyCalendar()
 41     {
 42         cPane = (JPanel) getContentPane();
 43     }
 44     //初始化,對全部的空間進行佈局
 45     public void init()
 46     {
 47 
 48         cPane.setLayout(new BorderLayout());    //使用Border佈局管理器
 49         calendar = Calendar.getInstance();    //獲取當前時間
 50         calendar = Calendar.getInstance();
 51         yearsLabel = new JLabel("Year: ");
 52         yearsSpinner = new JSpinner();
 53         yearsSpinner.setEditor(new JSpinner.NumberEditor(yearsSpinner,"0000"));
 54         yearsSpinner.setValue(new Integer(calendar.get(Calendar.YEAR)));
 55         //增長監聽 監聽年份的改變
 56         yearsSpinner.addChangeListener(new ChangeListener()
 57         {
 58             public void stateChanged(ChangeEvent changeEvent)
 59             {
 60                 int day = calendar.get(Calendar.DAY_OF_MONTH);
 61                 calendar.set(Calendar.DAY_OF_MONTH, 1);
 62                 calendar.set(Calendar.YEAR,((Integer)yearsSpinner.getValue()).intValue());
 63                 int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
 64                 calendar.set(Calendar.DAY_OF_MONTH, day>maxDay?maxDay:day);
 65                 updateView();    
 66             }
 67         });
 68 
 69         JPanel yearMonthPanel = new JPanel();
 70         cPane.add(yearMonthPanel,BorderLayout.NORTH);
 71         yearMonthPanel.setLayout(new BorderLayout());
 72         yearMonthPanel.add(new JPanel(),BorderLayout.CENTER);
 73         JPanel yearPanel = new JPanel();
 74         yearMonthPanel.add(yearPanel,BorderLayout.WEST);
 75         yearPanel.setLayout(new BorderLayout());
 76         yearPanel.add(yearsLabel,BorderLayout.WEST);
 77         yearPanel.add(yearsSpinner,BorderLayout.CENTER);
 78 
 79         monthsLabel = new JLabel("Month: ");
 80         //向月份下拉框中增長內容
 81         monthsComboBox = new JComboBox();
 82         for(int i=1; i<=12; i++)
 83         {
 84             monthsComboBox.addItem(new Integer(i));
 85         }
 86         monthsComboBox.setSelectedIndex(calendar.get(Calendar.MONTH));
 87         //監聽月份的改變
 88         monthsComboBox.addActionListener(new ActionListener() {
 89 
 90             @Override
 91             public void actionPerformed(ActionEvent actionEvevt) {
 92                 // TODO Auto-generated method stub
 93                 int day = calendar.get(Calendar.DAY_OF_MONTH);
 94                 calendar.set(Calendar.DAY_OF_MONTH,1);
 95                 calendar.set(Calendar.MONTH,monthsComboBox.getSelectedIndex());
 96                 int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
 97                 calendar.set(Calendar.DAY_OF_MONTH,day>maxDay?maxDay:day);
 98                 updateView();
 99             }
100         });
101 
102 
103         JPanel monthPanel = new JPanel();
104         yearMonthPanel.add(monthPanel,BorderLayout.EAST);
105         monthPanel.setLayout(new BorderLayout());
106         monthPanel.add(monthsLabel,BorderLayout.WEST);
107         monthPanel.add(monthsComboBox,BorderLayout.CENTER);
108 
109         daysModel = new AbstractTableModel() {
110 
111             @Override
112             public Object getValueAt(int row, int column) {
113                 // TODO Auto-generated method stub
114                 if(row==0)
115                 {
116                     return getHeader(column);
117                 }
118                 row--;
119                 Calendar calendar = (Calendar)MyCalendar.this.calendar.clone();
120                 calendar.set(Calendar.DAY_OF_MONTH,1);
121                 int dayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
122                 int moreDayCount = calendar.get(Calendar.DAY_OF_WEEK)-1;    //每月第一天從哪一列開始
123                 int index = row*7 + column;
124                 int dayIndex = index - moreDayCount + 1;
125                 if(index<moreDayCount||dayIndex>dayCount)
126                 {
127                     return null;
128                 }
129                 else
130                 {
131                     return new Integer(dayIndex);
132                 }
133             }
134             //設置行7
135             @Override
136             public int getRowCount() {
137                 // TODO Auto-generated method stub
138                 return 7;
139             }
140             //設置列7
141             @Override
142             public int getColumnCount() {
143                 // TODO Auto-generated method stub
144                 return 7;
145             }
146         };
147         daysTable = new CalendarTable(daysModel,calendar);
148         //設置每一個cell能夠被選中
149         daysTable.setCellSelectionEnabled(true);
150         daysTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
151         daysTable.setDefaultRenderer(daysTable.getColumnClass(0),new TableCellRenderer() {
152             @Override
153             public Component getTableCellRendererComponent(JTable table,Object value,
154                     boolean isSelected,boolean hasFocus,int row,int column) {
155                 String text = (value == null )? "" : value.toString();
156                 JLabel cell = new JLabel(text);
157                 cell.setOpaque(true);
158                 if(row == 0)
159                 {
160                     cell.setForeground(headerForeground);
161                     cell.setBackground(headerBackground);
162                 }
163                 else
164                 {
165                     if(isSelected)
166                     {
167                         cell.setForeground(selectedForeground);
168                         cell.setBackground(selectedBackground);
169                     }
170                     else
171                     {
172                         cell.setForeground(foreground);
173                         cell.setBackground(background);
174                     }
175                 }
176                 return cell;
177             }
178         });
179         updateView();
180         cPane.add(daysTable,BorderLayout.CENTER);
181     }
182 
183     public static String getHeader(int index)
184     {
185         switch(index)
186         {
187         case 0:
188             return WEEK_SUN;
189         case 1:
190             return WEEK_MON;
191         case 2:
192             return WEEK_TUE;
193         case 3:
194             return WEEK_WED;
195         case 4:
196             return WEEK_THU;
197         case 5:
198             return WEEK_FRI;
199         case 6:
200             return WEEK_SAT;
201         default:
202             return null;
203         }
204     }
205 
206     public void updateView()
207     {
208         daysModel.fireTableDataChanged();
209         daysTable.setRowSelectionInterval(calendar.get(Calendar.WEEK_OF_MONTH), 
210                 calendar.get(Calendar.WEEK_OF_MONTH));
211         daysTable.setColumnSelectionInterval(calendar.get(Calendar.DAY_OF_WEEK)-1,
212                 calendar.get(Calendar.DAY_OF_WEEK)-1);
213     }
214     //設置日曆的table
215     public static class CalendarTable extends JTable
216     {
217         private Calendar calendar;
218         public CalendarTable(TableModel model,Calendar calendar)
219         {
220             super(model);
221             this.calendar = calendar;
222         }
223         public void changeSelection(int row,int column,boolean toggle,boolean extend)
224         {
225             super.changeSelection(row, column, toggle, extend);
226             if(row == 0)
227             {
228                 return;
229             }
230             Object obj = getValueAt(row,column);
231             if(obj != null)
232             {
233                 calendar.set(Calendar.DAY_OF_MONTH,((Integer)obj).intValue());
234             }
235         }
236     }
237     //讓applet做爲一個可執行的程序來運行
238     public static void main(String[] args)
239     {
240         JFrame frame = new JFrame("ShuBing日曆");
241         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
242         MyCalendar myCalendar = new MyCalendar();
243         myCalendar.init();
244         frame.getContentPane().add(myCalendar);
245         frame.setSize(300,200);
246         frame.setVisible(true);
247     }
248 }
相關文章
相關標籤/搜索