Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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 smile

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