CALENDRIER PERPÉTUEL (1900~4999 PARAMÉTRABLE)

gmi19oj19 Messages postés 545 Date d'inscription lundi 10 mai 2004 Statut Membre Dernière intervention 28 septembre 2011 - 11 sept. 2004 à 10:03
kgadhi Messages postés 121 Date d'inscription mardi 9 août 2005 Statut Membre Dernière intervention 18 décembre 2007 - 8 nov. 2006 à 14:02
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/26077-calendrier-perpetuel-1900-4999-parametrable

kgadhi Messages postés 121 Date d'inscription mardi 9 août 2005 Statut Membre Dernière intervention 18 décembre 2007
8 nov. 2006 à 14:02
Bonjour tous le monde,

Le code est tres bon, et il marche.
Mais j'ai un petit soucis, j'aurais besoin de recuperer la date de la case sur laquelle on clique, et je ne sais pas comment faire.

Merci de votre aide.
bnreb10 Messages postés 1 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 30 juin 2006
30 juin 2006 à 09:27
Trés bon code, je l'ai réutilisé et compris trés facilement.
Encore merci.
vincjava Messages postés 7 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 1 septembre 2009
23 avril 2006 à 13:51
Salut Jouj !

J'avais un petit détail à ajouter. Dans cette classe, il y a pour chaque mois certains boutons vides sur lesquels on peut cliquer. Il serait intéressant de les désactiver, surtout qu'il ne faut ajouter que deux lignes de code :
_______________________________________________
Dans la méthode afficheCal()

Après la boucle for (int k=0;k<42;k++){

Ajouter: jours[k].setEnabled(false);

Après la boucle if ((k >= firstDayOfWeek) && (k <
(nbDaysInMonth + firstDayOfWeek))) {

Ajouter: jours[k].setEnabled(true);

+++
leguet007 Messages postés 2 Date d'inscription dimanche 4 décembre 2005 Statut Membre Dernière intervention 6 décembre 2005
5 déc. 2005 à 02:27
salut chers mis , je suis un débutant en domaine du programmation et j'ai besoin de vos conseillers , donc que quelqu'un me dis par quoi il recommandé de commencer step by step . merci à tous et bonne continuation .
leguet007 Messages postés 2 Date d'inscription dimanche 4 décembre 2005 Statut Membre Dernière intervention 6 décembre 2005
4 déc. 2005 à 22:36
salut chers mis , je suis un débutant en domaine du programmation et j'ai besoin de vos conseillers , donc que quelqu'un me dis par quoi il recommandé de commencer step by step . merci à tous et bonne continuation .
cs_fergan Messages postés 2 Date d'inscription lundi 27 juin 2005 Statut Membre Dernière intervention 27 juin 2005
27 juin 2005 à 18:32
il marche pas ton calendrier mais pas du tous :)
essay le premier jour de janvier 2005 il te dis ke c'est
un dimanche or c'est un samedi .....
a revoir koi et moi j'ai pas le temps
cs_Vld Messages postés 9 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 31 mai 2005
11 mai 2005 à 11:45
En fait moi j'ai restructuré son code, et les corrections que j'ai effectuées sont un peu loin déjà, désolé je serais incapable d'expliquer convenablement à moins que je replonge dedans ce que je ne peux pas, révisions oblige.

En revanche je vais copier l'integralité du code que moi j'utilise, comme ça vous pourrez voir où je veux en venir.
Si vous avez compris le sien, le mien devrait passer aussi.

Début du code :*******************************

import java.awt.*;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;

public class Calendrier extends JFrame implements ItemListener, WindowListener, ActionListener {

//attributs de classe
private GregorianCalendar cal;
private int firstDayOfWeek, nbDaysInMonth, year, month, begin,end=2020;
private Choice monthSelect,ta;
private JButton[] jours;
private JButton jbDeco;

public Calendrier() {

super("Agenda");
this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
this.addWindowListener(this);
cal = new GregorianCalendar();
this.init();
this.initCalendar(cal.get(Calendar.MONTH),cal.get(Calendar.YEAR));
this.afficheCal();
} //EOF

private void init() {
//construit un calendrier vierge
cal = (GregorianCalendar) Calendar.getInstance();
this.begin = cal.YEAR;
//les bouttons surlesquels on affiche le numéro du jour
jours = new JButton[42];
this.setSize(640,480);
this.setResizable(false);
this.getContentPane().removeAll();
this.getContentPane().setLayout(new GridLayout(8, 7));

//mise en forme...
for (int i = 0; i < 3; i++) {
this.getContentPane().add(new JLabel(" "));
} //EF

monthSelect = new Choice();
for (this.month = 0 ; this.month<12 ; this.month++){
monthSelect.add(monthToString());
} //EF
this.month = cal.MONTH;
this.year = cal.YEAR;
//Menu déroulant permettant de choisir le mois à afficher
monthSelect.select(month);
monthSelect.addItemListener(this);
this.getContentPane().add(monthSelect);
//Menu déroulant permettant d'afficher l'année à afficher
ta = new Choice();
for (int y=begin ; y<end ; y++){
ta.add(y+"");
} //EF
ta.select(this.year+"");
ta.addItemListener(this);
this.getContentPane().add(ta);
this.getContentPane().add(new JLabel(" "));
this.jbDeco = new JButton("Déconnecter");
this.jbDeco.setFont(new Font("arial",0,9));
this.jbDeco.addActionListener(this);
this.getContentPane().add(this.jbDeco);
//affiche les jours de la semaine
this.getContentPane().add(new JLabel("Lundi",JLabel.CENTER));
this.getContentPane().add(new JLabel("Mardi",JLabel.CENTER));
this.getContentPane().add(new JLabel("Mercredi",JLabel.CENTER));
this.getContentPane().add(new JLabel("Jeudi",JLabel.CENTER));
this.getContentPane().add(new JLabel("Vendredi",JLabel.CENTER));
this.getContentPane().add(new JLabel("Samedi",JLabel.CENTER));
this.getContentPane().add(new JLabel("Dimanche",JLabel.CENTER));
//Créé les différents bouttons et les ajoute à la fenêtre
for (int i=0;i<42;i++){
jours[i] = new JButton(" ");
this.getContentPane().add(jours[i]);
} //EF
} //EOF

/**
*
* Cette méthode renvoie le nom du mois correspondant à month + 1
* ex: pour month = 0 -> cette fonction renvoie janvier
*
*/
public String monthToString() {
String mois;
switch (this.month) {
case Calendar.JANUARY :
mois = "Janvier";break;
case Calendar.FEBRUARY :
mois = "Février";break;
case Calendar.MARCH :
mois = "Mars";break;
case Calendar.APRIL :
mois = "Avril";break;
case Calendar.MAY :
mois = "Mai";break;
case Calendar.JUNE :
mois = "Juin";break;
case Calendar.JULY :
mois = "Juillet";break;
case Calendar.AUGUST :
mois = "Août";break;
case Calendar.SEPTEMBER :
mois = "Septembre";break;
case Calendar.OCTOBER :
mois = "Octobre";break;
case Calendar.NOVEMBER :
mois = "Novembre";break;
case Calendar.DECEMBER :
mois = "Décembre";break;
default :
mois = "erreur";
}
return mois;
} //EOF

/**
* Cette méthode effectue les calculs principaux pour placer les jours
* du mois au bon en droit dans le tableau
* @param month, le mois à afficher
* @param year, l'année à afficher
*/
public void initCalendar(int mois, int annee) {

this.setName("Calendrier");

// paramètre le calendrier pour afficher selon ces 2 args
//les valeurs firstDayOfWeek, nbDaysInMonth, year, month sont paramétrées ici
cal = (GregorianCalendar) Calendar.getInstance();
Date today = cal.getTime();

//year & month :
this.year = annee;
this.month mois; // 0-11 ; 11 décembre

//firstDayOfWeek :
//jour de la semaine & mois d'aujourd'hui (1 = dimanche)
int jourSemaine = cal.get(Calendar.DAY_OF_WEEK);
int jourMois = cal.get(Calendar.DAY_OF_MONTH);

//Calendrier positionné au début du mois/année voulus et timestamp correspondant
cal.set(year, mois, 1);
Date dday = cal.getTime();

//calcul du nombre de secondes entre les deux dates
long nbs = (long) Math.round((dday.getTime() - today.getTime())/1000);
//calcul du nombre de jour entre les deux dates
int nbDays = (int) Math.round(nbs / 86400);
int nbDay = nbDays % 7; // modulo
jourSemaine = jourSemaine + nbDay;
//calcul du jour le semaine de la date rechercher
if (jourSemaine <= 0) {
this.firstDayOfWeek = jourSemaine + 7;
} else if (jourSemaine > 7) {
this.firstDayOfWeek = jourSemaine - 7;
} else {
this.firstDayOfWeek = jourSemaine;
} //EIF

//nbDaysInMonth :
if (mois == Calendar.FEBRUARY) {
if (cal.isLeapYear(year)) {
this.nbDaysInMonth = 29;
} else {
this.nbDaysInMonth = 28;
}//EIF
} else if (mois
Calendar.JANUARY | month
Calendar.MARCH | month
Calendar.MAY | month
Calendar.JULY | month
Calendar.AUGUST | month
Calendar.OCTOBER | month
== Calendar.DECEMBER) {
this.nbDaysInMonth = 31;
} else {
this.nbDaysInMonth = 30;
} //EIF

//on a tout pour l'afficher, restauration du calendrier
cal = (GregorianCalendar) Calendar.getInstance();
} //EOF

private void afficheCal() {
//on sélectionne par défaut le mois et l'année qu'on affiche
ta.select(this.year+"");
monthSelect.select(this.month);
//j correspond au numéro du jour à afficher
int j = 1;
//le "-2" vient du fait que le jour 1 correspond au dimanche, et que le tableau a 0 comme indice de départ
int firstButton = this.firstDayOfWeek-2;
if (firstButton <= 0) {
firstButton = firstButton + 7;
}//EIF
for (int k=0;k<42;k++){
if ((k >= firstButton) && (k < (nbDaysInMonth + firstButton))) {
//il faut afficher le numéro du jour
jours[k].addActionListener(this);
jours[k].setText(j + "");
jours[k].setFont(new Font("Serif",Font.ITALIC,10));
if ((this.year cal.get(Calendar.YEAR)) && (this.month cal.get(Calendar.MONTH)) && (j == cal.get(Calendar.DATE))) {
//le jour à afficher est le jour d'aujourd'hui
jours[k].setFont(new Font("Arial",Font.BOLD,26));
} //EIF
j++;
} else {
jours[k].setText("");
} //EIF
} //EF
} //EOF

public void itemStateChanged(ItemEvent arg0) {
//on affiche le nouveau calendrier
int indexM = monthSelect.getSelectedIndex();
int indexT = ta.getSelectedIndex()+this.begin;

this.init();
this.initCalendar(indexM,indexT);
this.afficheCal();
} //EOF

public void windowClosing(WindowEvent arg0) {
this.dispose();
} //EOF

public void actionPerformed(ActionEvent e) {
//résultat d'un clic sur un des boutons
} //EOF



public void windowActivated(WindowEvent arg0) {
}
public void windowClosed(WindowEvent arg0) {
}
public void windowDeactivated(WindowEvent arg0) {
}
public void windowDeiconified(WindowEvent arg0) {
}
public void windowIconified(WindowEvent arg0) {
}
public void windowOpened(WindowEvent arg0) {
}
} //EOC
cs_niktoo Messages postés 1 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 11 mai 2005
11 mai 2005 à 00:00
Vld salut!

je ne voi pas le 2eme bug dont tu parles..

où y a t-il des action listener sur les boutons??
et même je ne comprend pas comment cela résoud le problème de mettre this.getContentPane().removeAll();
cela va tout supprimer et il ne repasse pas par init() pour redessiner tout..
où le mets-tu??

merci de m'expliquer un peu @+ !!!
cs_Vld Messages postés 9 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 31 mai 2005
2 mai 2005 à 11:05
Autre bug, avec ton ItemListener quand tu changes de mois ou d'année dans la liste, tu recrées toute ton interface mais sans supprimer les composants d'avant (en l'occurence les boutons)

Du coup quand on clique sur un bouton cela appelle autant de fois l'action listener du bouton qu'on a changé de mois ou d'année dans tes listes.

Il faut faire un this.getContentPane().removeAll; pour remédier au problème.
cs_Vld Messages postés 9 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 31 mai 2005
25 avril 2005 à 16:47
Bon j'ai débuggé ton code, et je me suis permis de le modifier quelque peu pour respecter quelques règles chères à mes yeux (encapsulation etc)

Enfin, un tout petit peu, et cela reste ton code.

Pour ceux qui veulent uniquement la solution, le problème est dans afficheCal, il faut ajouter

if (firstDayOfWeek <= 0) {
firstDayOfWeek = firstDayOfWeek + 7;
}//EIF

juste avant la boucle for.

Un firstDayOfWeek de -1 (ça arrive lorsque le premier jour du mois est un dimanche) ne veut rien dire par la suite car il correspond au premier bouton remplit.

Bonne continuation et encore merci pour le script.
cs_Vld Messages postés 9 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 31 mai 2005
25 avril 2005 à 14:53
Impec, c'est bien fait et évolutif !

Cependant un léger bug chez moi, étant en avril 2005 le mois comporte effectivement 30 jours, en revanche lorsque je passe en mai, celui-ci n'en comporte que 30 aussi ... Le souci d'après moi vient du firstDayOfWeek, qui ne devrait pas être un lundi en mai mais bien un dimanche.

Une correction ?

A+
cs_Jouj Messages postés 13 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 17 novembre 2004
13 sept. 2004 à 21:31
vi, bien vu, c'est effectivement un gridLayout...
Je vais me pencher sur la JTable pour la prochaine fois, merci pour le conseil :)
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
13 sept. 2004 à 18:29
le screen ;o) apercu est pratik aussi ;o) ca permet une premiere critique :
tu semble avoir utilisé un gridbaglayout pour placer t bouton

en fait une JTable me semble plus approprié pour ce type de presentation en elle ofre bcp de posibiliter de presentation

;o) Autrement l idee est bonne c vrai que ds le jdk les date sont asser penible a gerer et y a pas d API de base ;-(
cs_Jouj Messages postés 13 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 17 novembre 2004
13 sept. 2004 à 18:02
dsl, pour les 50 lignes de codes... :s
Je recommencerai plus c promis ;)

bye

+jouj+
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
11 sept. 2004 à 16:05
ouai le Zip qd meme c est indispensable la.
20 lignes ca va mais pas plus sur la page....
gmi19oj19 Messages postés 545 Date d'inscription lundi 10 mai 2004 Statut Membre Dernière intervention 28 septembre 2011 2
11 sept. 2004 à 10:03
please, mets un zip.
ma connection est bonne, mais pense à ceux qui ont un 56k.
De plus, une capture d'écran serait la bienvenue.
Rejoignez-nous