Jcalendar internationalisé

Contenu du snippet

Cette classe affiche un calendrier suivant la locale.

Source / Exemple :


import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JCalendar
extends JPanel {
        
    private Locale _locale = getDefaultLocale();
    
    private GregorianCalendar _calendar = new GregorianCalendar();
    
    private DateFormatSymbols _dateSymbols = new DateFormatSymbols();
    
    private SimpleDateFormat _formatMY = new SimpleDateFormat("MMMM yyyy");
    
    private int _firstDayOfWeek = _calendar.getFirstDayOfWeek();
    
    private final JLabel _monthYear = new JLabel("", SwingUtilities.CENTER);
         
    private final JLabel[] _daysOfWeek = new JLabel[7];
    
    private final JButton[] _daysNumber = new JButton[42];
    
    private final ActionListener _changeMonth = new ActionListener() {
        public void actionPerformed(final ActionEvent ae) {
            final int nb = "next".equals(ae.getActionCommand()) ? 1: -1;
            _calendar.add(Calendar.MONTH, nb);
        updateMonthYear();
        updateDaysNumber();
        }
    };
    
    public JCalendar() {
        setLayout(new BorderLayout());
        // Month Panel
        final JPanel monthPanel = new JPanel();
        final JButton previous = new JButton("<<");
        previous.addActionListener(_changeMonth);
        final JButton next = new JButton(">>");
        next.addActionListener(_changeMonth);
        next.setActionCommand("next");
        _monthYear.setPreferredSize(new Dimension(120, 20));
        monthPanel.add(previous);
        monthPanel.add(_monthYear);
        monthPanel.add(next);
        add(monthPanel, BorderLayout.NORTH);
        // Day Panel
        final JPanel dayPanel = new JPanel();
        dayPanel.setLayout(new GridLayout(7, 7));
        for (int i = 0; i < 7; ++i)
            dayPanel.add(_daysOfWeek[i] = new JLabel("", SwingUtilities.CENTER));
        for (int i = 0; i < _daysNumber.length; ++i)
            dayPanel.add(_daysNumber[i] = new JButton());
        add(dayPanel, BorderLayout.CENTER);
        // Remplissage des composants
        updateMonthYear();
        updateDaysOfWeek();
        updateDaysNumber();
    }
    
    // Réactualise la locale et réaffiche le contenu des composants
    private void updateLocale(final Locale locale) {
        _locale = locale;
        final Date tmp = _calendar.getTime();
        _calendar = new GregorianCalendar(_locale);
        _calendar.setTime(tmp);
        _firstDayOfWeek = _calendar.getFirstDayOfWeek();
        _dateSymbols = new DateFormatSymbols(_locale);
        _formatMY = new SimpleDateFormat("MMMM yyyy", _locale);
        updateMonthYear();
        updateDaysOfWeek();
        updateDaysNumber();
    }
    
    // Affiche le mois et l'année en cours
    private void updateMonthYear() {
        _monthYear.setText(_formatMY.format(_calendar.getTime()));
    }
    
    // Affiche les jours de la semaine
    private void updateDaysOfWeek() {
        final String[] weekDays = _dateSymbols.getShortWeekdays();
        for (int i = 1; i < weekDays.length; ++i) {
            final int index = (i - 2 + _firstDayOfWeek) % 7 + 1;
            _daysOfWeek[i - 1].setText(weekDays[index]);
        }
    }
    
    // Affiche le numéro des jours
    private void updateDaysNumber() {
        final Date tmp = _calendar.getTime();
        _calendar.set(Calendar.DAY_OF_MONTH, 1);
        final int firstDay = _calendar.get(Calendar.DAY_OF_WEEK);
        final int LocalFirstDay = (firstDay - _firstDayOfWeek + 7) % 7 + 1;
        boolean full = false;
        for (int i = 0; i < _daysNumber.length; ++i) {
            //Détermine si le composant est affiché ou non
            final boolean isNotEmpty = i < LocalFirstDay - 1 || full;
            _daysNumber[i].setVisible(!isNotEmpty);
            // Affichage du jour
            if (!isNotEmpty) {
                final int dayOfMonth = _calendar.get(Calendar.DAY_OF_MONTH);
                _daysNumber[i].setText(String.valueOf(dayOfMonth));
                _calendar.add(Calendar.DAY_OF_MONTH, 1);
                full = 1 == _calendar.get(Calendar.DAY_OF_MONTH);
            }
        }
        _calendar.setTime(tmp);
    }
    
    
    public static void main(final String[] args)
    throws ParseException {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                final JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(new JCalendar());
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.