JPANEL CALENDRIER

alex1er Messages postés 39 Date d'inscription jeudi 11 avril 2002 Statut Membre Dernière intervention 5 juin 2006 - 26 août 2005 à 09:27
 Momo - 10 nov. 2017 à 11:17
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/33436-jpanel-calendrier

Svp ksk on ecrit dans le main
cs_ultrarich2001 Messages postés 26 Date d'inscription mercredi 4 juillet 2012 Statut Membre Dernière intervention 7 mars 2018
16 juil. 2012 à 19:11
Tarzent j’utilise en ce moment ton code pour generer le calendrier mais j'arrive pas a faire afficher a cote du nombre qui représente le jour soit "1" des lettres comme "A,B,C et D" qui determine les jours de marches peux tu me help hyper urgent
raniacharfeddine Messages postés 7 Date d'inscription dimanche 14 mars 2010 Statut Membre Dernière intervention 17 décembre 2011
17 déc. 2011 à 20:32
Salut Mr tncoder
bn je suis une débutante en java , mais ou est le main de cette calendrier pour l'exécuter
cs_nabilokov Messages postés 5 Date d'inscription samedi 3 janvier 2009 Statut Membre Dernière intervention 15 décembre 2009
22 févr. 2010 à 16:37
Bonjour ,

pourriez-vous mettre un code qui permet directement de sélectionner une date à partir d'un JCombobox ? calendrier cliquable
merci d'avance
ulysse00 Messages postés 291 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 12 mai 2013 1
9 nov. 2007 à 13:44
merci tarzent mais j'ai un soucis comment faire une actionlistener sur le bouton si je click sur _daysNumber[i]

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);
Corwen Messages postés 1 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 8 décembre 2005
8 déc. 2005 à 18:37
Bonjour a tous.
Je vien de decouvrir cette classe.
Elle pourrait m'aider a avancer l'un de mesp rojet d'etudes.
Mais il se presente un petit soucis.
En effet, la compilation se passe bien mais a l'execution il me dit qu'il y a un petit probleme de main
Comment resoudre ce probleme.
Merci d'avance.
XIIIOreiller Messages postés 7 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 23 juillet 2007
8 nov. 2005 à 10:39
Tarzent, pour ce qui est du _ pour les propriétés private d'une classe, ce n'est pas la norme car tu ne trouvera jamais une norme de programmation utilisé ceci (je suis prestataire de service en informatique et j'ai vu un paquet de norme de programmation).

Pour une programmation "propre", l'ensemble des propriétés d'une classe devrait être private ou protected (pour l'héritage) avec des méthodes public permettant de modifier ces propriétés.
ex :

private int nomDeLaVariable = 0;

et
public void setVariable(int value) {
nomDeLaVariable = value;
}
public int getVariable() {
return nomDeLaVariable ;
}

Après, il est nécessaire de nommer la variable de façon à bien la reconnaitre et une des méthodes le plus souvent employée est d'utiliser le préfixe m_ (pour variable membre) plutot que "_". Après cela est à l'appréciation de chacun mais la méthode que je te donne permet d'utiliser plusieurs préfixe genre s_ pour des constantes static (ceci n'est pas utiliser dans java, généralement c'est en majuscule).

Bref, tout cela pour dire qu'il n'y a pas de norme universelle mais qu'il est intéressant de voir comment cela est fait dans les classes de base de java et de faire pareil pour qu'il y ait une certaine homogénéité dans le code source (cela aide les gens qui utilise votre code).
tarzent Messages postés 30 Date d'inscription vendredi 12 juillet 2002 Statut Membre Dernière intervention 15 mai 2009
8 nov. 2005 à 01:14
J'ai codé cette classe un peu vite, désolé pour l'initialisation des variables.
Par contre Natha je ne vois pas trop où tu as vu que ce n'était pas à la norme d'utiliser des '_' pour les propriétés private d'une classe... C'est beaucoup plus lisible comme ça et ça évite bien des confusions.

Quant-à ton lien sur le JCalendar, je trouve qu'il est assez interessant (je le connaissais déjà), mais je trouve ça un peu exagéré pour ceux qui veulent juste afficher un calendrier basique.
XIIIOreiller Messages postés 7 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 23 juillet 2007
22 oct. 2005 à 09:55
Je suis d'accord avec Natha pour dire qu'il ne sert pas à grand chose de refaire des choses existantes et qu'utiliser ce qui existe est bien, mais n'est il pas plus important d'apprendre (c a d refaire des choses simples pour apprendre les base - comme utiliser un layout ou en faire un soit même). Donc pour moi, le seul truc qui me gene, c'est la non utilisation de layout (non conforme à la norme swing et reutilisabilité que je qualifierait d'inexistante), pour ce qui est de refaire un calendar, là j'aurais tendance à dire pas de problème, c'est même bien car on peut vouloir certaine spécificités, donc d'un point de vue pédagogique, c'est très bien.
Utilisateur anonyme
21 oct. 2005 à 14:22
Y a mieux :

http://www.toedter.com/en/jcalendar/

Au passage pour tarzent : l'utilisation de '_' pour les propriétés de ta classe c'est pas à la norme... On fait pas du C ici mais du Java. C'est pas propre non plus d'initialiser toutes tes variables directement. Un constructeur en général, ça sert à ça. Enfin bon, à ta façon de coder en général on voit que tu viens du C et/ou C++.

Pour tncoder, tu perds un temps fou si tu calcules toutes les positions pour te passer des layout manager. Utilise le FormLayout de JGoodies, tu gagneras un temps précieux et en plus ça sera plus facile à maintenir.
tarzent Messages postés 30 Date d'inscription vendredi 12 juillet 2002 Statut Membre Dernière intervention 15 mai 2009
3 oct. 2005 à 21:20
Voilà, j'en ai codé un assez rapidement. Ca va très vite lorsqu'on a les bonnes classes à disposition. J'ai même eu le temps d'ajouter un changement de locale : les jours sont affichés et disposés (premier jour = dimanche ou lundi) en fonction de cette locale.
Si mon code n'est pas suffisament lisible, n'hésitez pas à me poser des questions.

J'envisage d'en poster un un peu plus évolué dans quelques temps.

###################################################################################

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);
}
});
}
}
tarzent Messages postés 30 Date d'inscription vendredi 12 juillet 2002 Statut Membre Dernière intervention 15 mai 2009
2 oct. 2005 à 03:31
Bonsoir,

Je ne comprends vraiment pas pourquoi tu n'utilises pas un GregorainCalendar. Là t'es obligé de tout te retaper à la main.
Idem pour ce qui est des Jours et des Mois, il y a moyen de récupérer directement tout ça dans des String sans les définir à la main.

A ne pas vouloir utiliser des classes déjà existantes (ce qui au passage permettrait de réduire au moins de moitié la longueur de ton code), ton interprétation des années bissextiles s'en trouve fausse. Il y a qqch à prendre en compte au niveau des siècles me semble-t-il...

Si j'ai un peu de temps je posterai un code raccourci... ;-)

Si tu as des questions n'hésite pas !
tncoder Messages postés 5 Date d'inscription mercredi 3 août 2005 Statut Membre Dernière intervention 13 septembre 2005
30 août 2005 à 12:36
merci ESP32HAY , moi meme je suis en train d'apprendre java et ce site m'aide ennormément , amors bon courage à nous deux ;)
tncoder Messages postés 5 Date d'inscription mercredi 3 août 2005 Statut Membre Dernière intervention 13 septembre 2005
30 août 2005 à 12:34
POUR MR XIIIOreiller, je ne dis jamais non pour apprendre alors bienvenue à tte tes proposition et pour les raison d'eviter le gragorainCalendar etc.. j'ai ma propre classe SDate qui utilise plusieur fonctions de Calendar et compagnie mais j'ai utilisé cette maniere pour me simplifier la vie c tt , c à la machine de se casser la tete :)
et pouur ce qui est des Layout manager je les deteste ;) d'habitude je fais tt seul les calcul pour garder l'interface intacte , mais en ce moment je suis un peu précé par le temps je dois livrer une version beta d'un petit projet donc l'optimisation c pa ma priorité mnt
merci qd meme pour tes remarques et bienvenue encore pour ton aide
EPS32HAY Messages postés 100 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 1 février 2009
30 août 2005 à 11:36
Salut,

Moi je connais pas grand chose en JAVA, mais je tiens à te remercier pour ce code qui va surement m'aider.

Bonne prog
XIIIOreiller Messages postés 7 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 23 juillet 2007
30 août 2005 à 11:32
Je voulais juste rajouter que mes critiques ne sont pas là pour te décourager, au contraire, plus nombreux sont les avis, plus on a de chance de progresser. Libre à toi après de faire de la refonte de code si tu le souhaite.
XIIIOreiller Messages postés 7 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 23 juillet 2007
30 août 2005 à 11:25
Bon, je n'ai pas utilisé ton source mais par contre, je vais me permettre d'en faire une analyse rapide.

1) Un GROS défaut selon moi, l'utilisation de la méthode setBounds alors que ton calendrier héritant de JPanel, il sera positionné à l'aide du LayoutManager donc, les coordonnées seront calculées automatiquement

2) Quelques coquilles dans le code mais rien de bien grave (si tu veux que je t'en dise un peu plus, dis le moi, on ne va pas s'éterniser là dessus)

3) Une question me vient à l'esprit, pourquoi n'as tu pas utiliser certaines classes gérant la date??? Cela t'aurais éviter de faire du code pour rien (mais tu dois avoir tes raisons que je ne connais pas mai qui m'intéresse)

Voila, si tu veux que l'on discute plus longuement du comment rendre ton code plus propre (et donc plus exploitable), n'hésite pas demande moi, il n'y a pas de problème.
tncoder Messages postés 5 Date d'inscription mercredi 3 août 2005 Statut Membre Dernière intervention 13 septembre 2005
26 août 2005 à 21:50
dslé , la classe grille n'est pas manquante
en fait cette meme classe s'appelait grille mais moi je l'ai changé avant de la publier donc il te suffit de remplacer le mot "Grille" par "Calendrier" dans tt le code et ça va marcher
sinon laisse un msg @+
alex1er Messages postés 39 Date d'inscription jeudi 11 avril 2002 Statut Membre Dernière intervention 5 juin 2006
26 août 2005 à 09:27
Il manque la classe Grille

@+
Rejoignez-nous