Pages : 1
#1 Le 09/01/2013, à 17:23
- shoot76
[JAVA] (Résolu)
Bonjour à tous,
Ayant développé un programme en bash il y a quelques temps (à usage personnel), j'ai décidé de le reprogrammer en Java, pour l'utilisation multi plateforme, et le mettre ainsi à disposition de ma famille (qui l'a apprécié), des amis, et pourquoi pas sur un site permettant à d'autres étudiants de l'utiliser (c'est un logiciel de planning de révision, basé sur une méthode enseignée dans une prépa que j'ai fréquenté). Bref ... les présentations faites, je vous énonce mon problème (je suis débutant en Java, merci si possible d'expliquer le pourquoi du comment)
Je souhaitais ajouter un Calendrier à ce logiciel, pour permettre une sélection du jour d'intérêt par l'utilisateur. J'ai trouvé un code tout fait sur internet (ceci étant largement au dessus de mes compétences, j'avoue ... j'ai plagié). La classe fonctionne à merveille sous eclipse, le calendrier se lance.
J'essaie d'appeler la classe dans ma méthode main en suivant les cours que j'ai eu, et divers infos glanées sur le net, mais là, ça ne s'affiche pas, pourriez vous m'expliquer pouquoi ?
voici le code de la classe principale :
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
public class methj {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Calendar calendar=Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
int[] dateJ = {0,1,3,7,14,30,60};
for (int i : dateJ) {
calendar.add(Calendar.DATE, i);
System.out.println("Nous serons le: "+sdf.format(calendar.getTime()));
/*FileWriter fw = new FileWriter("Dates.txt");
fw.write(sdf.format(calendar.getTime()));
fw.close();*/
}
Calendrier cal = new Calendrier();
cal.setVisible(true);
}
}
et le calendrier si c'est utile :
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 javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Calendrier
extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
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 Calendrier() {
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();
}
// 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 Calendrier());
frame.pack();
frame.setVisible(true);
}
});
}
}
Merci à vous
Dernière modification par shoot76 (Le 09/01/2013, à 18:14)
~ Data-sientist freelance : https://skulder.fr
Hors ligne
#2 Le 09/01/2013, à 17:47
- Maisondouf
Re : [JAVA] (Résolu)
cal.setVisible(true);
setVisible n'est pas définie pour les objets Calendrier
ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor, OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)
Hors ligne
#3 Le 09/01/2013, à 17:55
- Maisondouf
Re : [JAVA] (Résolu)
Remplace tes deux lignes
//Calendrier cal = new Calendrier();
//cal.setVisible(true);
par
Calendrier.main(null);
ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor, OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)
Hors ligne
#4 Le 09/01/2013, à 17:59
- shoot76
Re : [JAVA] (Résolu)
Tout d'abord merci pour la rapidité, ça fonctionne
Mais j'aimerai bien comprendre, peux-tu m'expliquer s'il te plait ?
~ Data-sientist freelance : https://skulder.fr
Hors ligne
#5 Le 09/01/2013, à 18:18
- Maisondouf
Re : [JAVA] (Résolu)
Tu as deux classes "autonomes" (avec une fonction main) "methj" et "Calendrier"
Le fait de créer un objet Calendrier avec new n'appelle que le constructeur, c'est à dire Calendrier.Calendrier() mais pas Calendrier.main().
Étant donné que ta classe Calendrier est prévue comme indépendante, le fait d'appeler Calendier.main() depuis une autre classe, va d'abord appeler le constructeur avant d'appeler main().
Et c'est main() qui affiche la fenêtre, regardes bien le code.
La façon élégante aurait été de créer un classe à double entrée, c'est à dire appelable en solo ou depuis une autre classe.
Il suffit de rajouter à l'intérieur une fonction display() qui appelle main().
L'appel aurait été:
Calendrier cal = new Calendrier();
cal.display();
Cela permet de traiter différemment les cas (couleurs, taille, etc,etc)
ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor, OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)
Hors ligne
Pages : 1