Télécharger le zip
please, mets un zip.ma connection est bonne, mais pense à ceux qui ont un 56k.De plus, une capture d'écran serait la bienvenue.
ouai le Zip qd meme c est indispensable la.20 lignes ca va mais pas plus sur la page....
dsl, pour les 50 lignes de codes... :sJe recommencerai plus c promis ;)bye+jouj+
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 ;-(
vi, bien vu, c'est effectivement un gridLayout...Je vais me pencher sur la JTable pour la prochaine fois, merci pour le conseil :)
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+
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; }//EIFjuste 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.
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.
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 @+ !!!
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
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
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 .
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); +++
Trés bon code, je l'ai réutilisé et compris trés facilement.Encore merci.
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.
Se souvenir du profil
Mot de passe oublié ? / Activation de compteCréer un compte
1 598 776 membres 44 nouveaux aujourd'hui 15 441 membres club