Guest User

Untitled

a guest
Jun 27th, 2012
594
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.awt.Color;
  2. import java.awt.Dimension;
  3. import java.awt.GridLayout;
  4. import java.util.Calendar;
  5.  
  6. import javax.swing.BoxLayout;
  7. import javax.swing.JFrame;
  8. import javax.swing.JLabel;
  9. import javax.swing.JPanel;
  10. import javax.swing.JSpinner;
  11. import javax.swing.JTextField;
  12. import javax.swing.SpinnerListModel;
  13. import javax.swing.SpinnerNumberModel;
  14. import javax.swing.SwingConstants;
  15. import javax.swing.UIManager;
  16. import javax.swing.UnsupportedLookAndFeelException;
  17. import javax.swing.border.LineBorder;
  18. import javax.swing.event.ChangeEvent;
  19. import javax.swing.event.ChangeListener;
  20.  
  21. public class Main {
  22.     public static void main(String[] args) {
  23.         JFrame frame = new JFrame("Swing Calender");
  24. //      frame.setSize(400,600);
  25.         frame.add(new SwingCalendar());
  26.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  27.         frame.pack();
  28.         frame.setVisible(true);
  29.     }
  30. }
  31.  
  32.  
  33. class SwingCalendar extends JPanel {
  34.     private JSpinner  monthChooser = new JSpinner();
  35.     private JSpinner  yearChooser = new JSpinner();
  36.    
  37.     private JLabel[]    weekLabels = new JLabel[7];
  38.     private JLabel[][]  dayLabels = new JLabel[6][7];
  39.    
  40.     private static final Color WEEK_BG = new Color(240,240,255);
  41.     private static final LineBorder WEEK_BORDER = new LineBorder(new Color(160,160,230), 2, false);
  42.    
  43.     private static final Color DAY_BG = new Color(250,250,255);
  44.     private static final Color DAY_FG = Color.BLACK;
  45.     private static final LineBorder DAY_BORDER = new LineBorder(new Color(40,40,40), 2, false);
  46.    
  47.     private static final Color TODAY_BG = new Color(255, 240, 240);
  48.     private static final Color TODAY_FG = new Color(105,50,50);
  49.     private static final LineBorder TODAY_BORDER = new LineBorder(new Color(175,50,50), 2, false);
  50.  
  51.    
  52.     private static final Dimension DAY_LABEL_SIZE = new Dimension(50,50);
  53.     private static final String[] WEEK_NAMES = new String[] {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
  54.     private static final String[] MONTH_NAMES = new String[] {"JAN", "FEB", "MAR", "APR", "MAY", "JUNE", "JULY", "AUG", "SEP", "OCT", "NOV", "DEC"};
  55.        
  56.     public SwingCalendar() {
  57.         try {
  58.             UIManager.setLookAndFeel(
  59.                 "javax.swing.plaf.nimbus.NimbusLookAndFeel"
  60.             );
  61.         } catch (ClassNotFoundException | InstantiationException
  62.                 | IllegalAccessException | UnsupportedLookAndFeelException e) {
  63.             e.printStackTrace();
  64.         }
  65.        
  66.         /* MONTH CHOOSER */
  67.         monthChooser.setModel(new SpinnerListModel(MONTH_NAMES));
  68.         JTextField tm = ((JSpinner.DefaultEditor)monthChooser.getEditor()).getTextField();
  69.         tm.setHorizontalAlignment(JTextField.CENTER);
  70.        
  71.         ChangeListener monthYearListener = new ChangeListener(){
  72.             public void stateChanged(ChangeEvent e) {
  73.                 String value = (String) monthChooser.getValue();
  74.                
  75.                 int month = 0;
  76.                 for( int i=0; i<MONTH_NAMES.length; i++ ){
  77.                     if( value.equals(MONTH_NAMES[i]) ){
  78.                         month = i;
  79.                         break;
  80.                     }
  81.                 }
  82.                
  83.                 refreshDayLabels((int) yearChooser.getValue(), month);
  84.             }
  85.         };
  86.        
  87.         monthChooser.addChangeListener(monthYearListener);
  88.        
  89.         Dimension dm = monthChooser.getPreferredSize();
  90.         dm.width += 10; //dm.height += 1;
  91.         monthChooser.setPreferredSize(dm);
  92.        
  93.         /* YEAR CHOOSER */
  94.         yearChooser.setModel(new SpinnerNumberModel(2012, 0, 5000,1 ));
  95.         JSpinner.NumberEditor editor = new JSpinner.NumberEditor(yearChooser, "#");
  96.         yearChooser.setEditor(editor);
  97.         yearChooser.addChangeListener(monthYearListener);
  98.        
  99.         Dimension dy = yearChooser.getPreferredSize();
  100.         dy.width += 10; //dy.height += 1;
  101.         yearChooser.setPreferredSize(dy);
  102.        
  103.         /* DAY PANEL */
  104.         JPanel dayPanel = new JPanel();
  105.         GridLayout layout = new GridLayout(7, 7);
  106.         layout.setHgap(3);
  107.         layout.setVgap(3);
  108.         dayPanel.setLayout(layout);
  109.        
  110.         for( int i=0; i<7; i++) {
  111.             weekLabels[i] = new JLabel(WEEK_NAMES[i]);
  112.             weekLabels[i].setHorizontalAlignment(SwingConstants.CENTER);
  113.             weekLabels[i].setVerticalAlignment(SwingConstants.CENTER);
  114.             weekLabels[i].setPreferredSize(DAY_LABEL_SIZE);
  115.             weekLabels[i].setOpaque(true);
  116.             weekLabels[i].setBackground(WEEK_BG);
  117.             weekLabels[i].setBorder(WEEK_BORDER);
  118.             if( i == 0 ) {
  119.                 weekLabels[i].setForeground(Color.RED);
  120.             } else if ( i == 6 ) {
  121.                 weekLabels[i].setForeground(Color.BLUE);
  122.             }
  123.            
  124.             dayPanel.add(weekLabels[i]);
  125.         }
  126.        
  127.         for( int i=0; i<6; i++) {
  128.             for( int j=0; j<7; j++) {
  129.                 dayLabels[i][j] = new JLabel();
  130.                 dayLabels[i][j].setHorizontalAlignment(SwingConstants.CENTER);
  131.                 dayLabels[i][j].setVerticalAlignment(SwingConstants.CENTER);
  132.                 dayLabels[i][j].setOpaque(true);
  133.                 dayLabels[i][j].setBackground(DAY_BG);
  134.                 dayLabels[i][j].setPreferredSize(DAY_LABEL_SIZE);
  135.                 dayLabels[i][j].setBorder(new LineBorder(Color.DARK_GRAY, 2, false));
  136.                 dayPanel.add(dayLabels[i][j]);
  137.             }
  138.         }
  139.        
  140.         setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
  141.         JPanel chooserPanel = new JPanel();
  142.         GridLayout l = new GridLayout(1,2);
  143.         l.setHgap(10); l.setVgap(10);
  144.         chooserPanel.add(yearChooser);
  145.         chooserPanel.add(monthChooser);
  146.        
  147.         add(chooserPanel);
  148.         add(dayPanel);
  149.        
  150.         Calendar cal = Calendar.getInstance();
  151.         monthChooser.setValue(MONTH_NAMES[cal.get(Calendar.MONTH)]);
  152.         yearChooser.setValue(cal.get(Calendar.YEAR));
  153.         refreshDayLabels(cal, true);
  154.     }
  155.    
  156.     private void refreshDayLabels(int year, int month) {
  157.         Calendar cal = Calendar.getInstance();
  158.         if( month == cal.get(Calendar.MONTH) && year == cal.get(Calendar.YEAR)) {
  159.             refreshDayLabels( cal, true);
  160.         } else {
  161.             cal.set(year, month, 1);
  162.             refreshDayLabels(cal, false);
  163.         }
  164.     }
  165.    
  166.     private void refreshDayLabels(Calendar calendar, boolean currentMonth) {
  167.         int maxDate = calendar.getActualMaximum(Calendar.DATE);
  168.         int today = calendar.get(Calendar.DATE);
  169.        
  170.         calendar.set(Calendar.DATE, 1);
  171.         int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
  172.        
  173.         for( JLabel[] ll : dayLabels) {
  174.             for( JLabel l : ll ) {
  175.                 l.setText("");
  176.             }
  177.         }
  178.        
  179.         for( int day=1; day<=maxDate; day++ ) {
  180.             getDayLabel( day, firstDayOfWeek ).setText(Integer.toString(day));
  181.         }
  182.  
  183.         for( int i=0; i<dayLabels.length; i++) {
  184.             for( int j=0; j<dayLabels[i].length; j++) {
  185.                 JLabel l = dayLabels[i][j];
  186.                 l.setBackground(DAY_BG);
  187.                 l.setForeground(DAY_FG);
  188.                 l.setBorder(DAY_BORDER);
  189.                
  190.                 if( l.getText().length() != 0 ) {
  191.                     l.setVisible(true);
  192.                 } else {
  193.                     l.setVisible(false);
  194.                 }
  195.             }
  196.         }
  197.        
  198.         if( currentMonth ) {
  199.             JLabel l = getDayLabel( today, firstDayOfWeek );
  200.             l.setBackground(TODAY_BG);
  201.             l.setForeground(TODAY_FG);
  202.             l.setBorder(TODAY_BORDER);
  203.         }
  204.     }
  205.    
  206.     private JLabel getDayLabel( int day , int firstDayOfWeek ) {
  207.         return dayLabels[(day + firstDayOfWeek - 2)/7][(day + firstDayOfWeek - 2)%7];
  208.     }
  209. }
RAW Paste Data