[JAVA] Ancora problemi con il GregorianCalendar...

fpertegato

Nuovo Utente
26 Lug 2010
16
12
0
Vicenza
Ciao a tutti!!:byebye:
Altri problemi con il GregorianCalendar... :(
Sto tentando di scrivere il codice per una classe aggiungi-tempo...ci sto studiando su ma non capisco dove sbaglio: l'output non cambia neanche a pagarlo! Posto il codice qui sotto, se qualcuno capisce dove sbaglio mi può illuminare per favore?
Codice:
    // la classe che definisce il ricevitore di eventi usato 
    // dal bottone Aggiungi tempo:
    class Receiver4 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

	String SGiorno = ggStart.getText ();
	String SMese = mmStart.getText ();
	String SAnno = yyStart.getText ();

	String EGiorno = ggEnd.getText ();
	String EMese = mmEnd.getText ();
	String EAnno = yyEnd.getText ();

//Parsing:
	int day = Integer.parseInt(SGiorno);
	int month = Integer.parseInt(SMese);
	int year = Integer.parseInt(SAnno);

//Tempo da aggiungere
	int Agg = Integer.parseInt(EGiorno);
	int Amm = Integer.parseInt(EMese);
	int Ayy = Integer.parseInt(EAnno);

        GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
        cal.setLenient (false);

	Calendar now = cal.getInstance();

//Aggiunte
	now.add(Calendar.DAY_OF_MONTH, Agg);
	now.add(Calendar.MONTH, Amm);
	now.add(Calendar.YEAR, Ayy);

	testoOutput.setText(cal.get(Calendar.YEAR) + "/" + cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.DAY_OF_MONTH));

		}
	}
Intanto tento di documentarmi ulteriormente...:book:
 
  • Like
Reactions: ottofonsuppost
Secondo me stai facendo un po' di confusione e non mi riferisco solamente alla conoscenza o meno del linguaggio Java. I problemi sono soprattutto logici.
E' ovvio che la data non cambi in quanto la incrementi sull'attributo now e poi loggi l'attributo cal.
Inoltre quello che fai ha poco senso in quanto crei una nuova istanza di GregorianCalendar passandogli i parametri (year, month-1, day), poi invece crei l'istanza di Calendar now che contiene la datta attuale, incrementi quella e poi loggi cal.
Così com'è il codice se loggi cal ottieni la data da te impostata, se loggi now ottieni la data attuale incrementata.
 
  • Like
Reactions: ottofonsuppost
Grazieee!!!!:)
Si, in effetti ero mega-confuso...!!
dopo aver appena istanziato il calendario con la data corretta ne ho istanziato un altro con la data errata ed ho continuato su quello..!!
Posto qui sotto la mia correzione:
Codice:
    // la classe che definisce il ricevitore di eventi usato 
    // dal bottone Aggiungi tempo:
    class Receiver4 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

	String SGiorno = ggStart.getText ();
	String SMese = mmStart.getText ();
	String SAnno = yyStart.getText ();
Ora ho corretto un pò il codice, ma devo aver sbagliato qualcos'altro perchè l'output non cambia comunque..
	String EGiorno = ggEnd.getText ();
	String EMese = mmEnd.getText ();
	String EAnno = yyEnd.getText ();

//Parsing:
	int day = Integer.parseInt(SGiorno);
	int month = Integer.parseInt(SMese);
	int year = Integer.parseInt(SAnno);

//Tempo da aggiungere
	int Agg = Integer.parseInt(EGiorno);
	int Amm = Integer.parseInt(EMese);
	int Ayy = Integer.parseInt(EAnno);

        GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
        cal.setLenient (false);

//Aggiunte su cal
	cal.add(Calendar.DAY_OF_MONTH, Agg);
	cal.add(Calendar.MONTH, Amm);
	cal.add(Calendar.YEAR, Ayy);

//Settaggio del testo di output (JTextArea, setEditable(false)) credo che l'errore sia //qui!
	testoOutput.setText(cal.get(Calendar.YEAR) + "/" + cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.DAY_OF_MONTH));
Però devo aver sbagliato qualcos'altro perchè l'output non cambia comunque,credo di aver sbagliato nel settaggio di testoOutput.
 
  • Like
Reactions: ottofonsuppost
Io ho provato il codice sostituendo testoOutput.setText() con System.out.println() in modo da vedere a video il risultato dell'incremento e sostituendo con dei valori costanti gli attributi Agg, Amm e Ayy e funziona correttamente. Se a te da problemi prova a controllare i valori che ti arrivano dalle textbox.
 
  • Like
Reactions: ottofonsuppost
AAh, ok!
Grazie ora mi viene scritto l'output anche nell'Applet! :fonzie:
Però se nei campi anno-mese-giorno da aggiungere scrivo 1 non mi aggiunge niente..probabilmente ho sbagliato qualcosa con il mese ora controllo!
 
  • Like
Reactions: ottofonsuppost
Ma sei sicuro di voler impostare il setLenient() a false piuttosto che a true? Così facendo se passi al GregorianCalendar dei valori non pertinenti (tipo valori negativi o valori oltre il range come ad esempio > 12 per il mese e > 31 per il giorno) essi non vengono reinterpretati come invece verrebbe fatto impostando il setLenient() a true. In questo modo sei libero di sommare o sottrarre ciò che vuoi ai valori di giorno, mese ed anno in quanto, ad esempio un valore superiore a 12 o inveriore ad 1 nel campo mese verrebbero automaticamente interpretati come mesi dell'anno successivo o precedente.
 
  • Like
Reactions: ottofonsuppost
Non capisco: ciò vuol dire che per esempio scrivessi 13 nel campo dei mesi sbaglierei poichè anzichè "13" mi sommerebbe "12"? :confused:

Questa non l'ho capita!!! Comunque quello che voglio dire è che se setLenient() è impostato a false un valore non valido nei campi giorno, mese e anno causano una IllegalArgumentException. Se ad esempio il GregorianCalendar è impostato alla data di oggi 27 Luglio 2010 e tu sommi 5 al numero dei giorni ottieni come nuova data 32 Luglio 2010 che nel caso di setLenient() a false solleva una IllegalArgumentException in quanto il giorno 32 non esiste. Se invece imposti il setLenient() a true lo stesso esempio ti restituirebbe 1 Agosto 2010 in quanto il 32 Luglio equivale al 1 Agosto (31 giorni Luglio + 1 giorno di Agosto).
Fai delle prove con differenti date e differenti impostazioni di setLenient() e ti renderai conto.
 
  • Like
Reactions: ottofonsuppost
Ok,ho capito e corretto...grazie per il suggerimento!! L'avevo letto, ma avevo capito il contrario...
Però mi sono accorto che non mi aggiunge i mesi, o meglio: se sono a 30 giorni e ne aggiungo 2 mi va all'1 del mese successivo,ma se ho il campo-mese (SMese) a 2 e aggiungo 1 mese lui non aggiunge niente...:book:
 
  • Like
Reactions: ottofonsuppost
Sono riuscito a mettere a posto il problema, anche se come ho fatto non mi convince affatto...
Comunque posto qui di seguito il codice:
Codice:
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.*;
import java.awt.*;

import java.util.*;
import java.util.Calendar;

public class myCalendar7 extends JApplet {
    private static final long serialVersionUID = 1L;

    JButton[] bottone;
    JPanel pannelloBottoni;
    JPanel pannelloCampi;
    Container pannelloApplet;

    public JTextField ggStart = new JTextField(10);
    public JTextField mmStart = new JTextField(10);
    public JTextField yyStart = new JTextField(10);

    public JTextField ggEnd = new JTextField(10);
    public JTextField mmEnd = new JTextField(10);
    public JTextField yyEnd = new JTextField(10);

//	Labels della data iniziale
    public JLabel gS = new JLabel("Giorno iniziale:");
    public JLabel mS = new JLabel("Mese iniziale:");
    public JLabel yS = new JLabel("Anno iniziale:");

//	Labels della data finale
    public JLabel gE = new JLabel("Giorno finale:");
    public JLabel mE = new JLabel("Mese finale:");
    public JLabel yE = new JLabel("Anno finale:");

//	Label TestoOutput

    public JLabel Output = new JLabel("Risultato:");
    public JTextArea testoOutput = new JTextArea();

    public void init() {

//   Settaggio testo
	testoOutput.setEditable(false);
	testoOutput.setText("Inserire i dati");	

	// Definisco il layout dell'applet: 

	pannelloApplet = getContentPane();
	pannelloApplet.setLayout(new BorderLayout());

	// inseriremo i 6 bottoni non direttamente dell'applet, 
	// ma in un pannello che verra' inserito nel centro dell'
	// applet. Costruiamo il pannello: 

	pannelloBottoni = new JPanel();

	// dispongo i 6 bottoni in una griglia 3 x 2:
	pannelloBottoni.setLayout(new GridLayout(3, 2));
	// definisco il colore di fondo del pannelloBottoni:
	pannelloBottoni.setBackground(Color.black);

	// definisco un array di 6 bottoni.
	bottone = new JButton[9];

	// inizializzo i 6 bottoni e li aggiungo al pannelloBottoni.
	// Etichetta dei bottoni:
	String[] nomeBottone = {"Componi data", "Data corrente", "Controllo data", 
				"Aggiungi tempo", "bott. 5", "bott. 6",
				"bott. 7", "bott. 8", "bott. 9"};

	// Colore di sfondo dei bottoni: 
	Color[] coloreBottone = {Color.red, Color.white, Color.yellow,
				 Color.cyan, Color.green, Color.magenta,
				Color.red, Color.white, Color.yellow};

	for (int i = 0; i < bottone.length; i++) {
	    bottone[i] = new JButton(nomeBottone[i]);
	    bottone[i].setBackground(coloreBottone[i]);
	    pannelloBottoni.add(bottone[i]);}

	// inserisco il pannelloBottoni a sud dell'applet: 
	pannelloApplet.add(pannelloBottoni, BorderLayout.SOUTH);

//	Definisco il pannello e i campi d'Input che dovrà contenere:
	JPanel pannelloCampi = new JPanel();
	pannelloCampi.setLayout(new GridLayout(2,6,0,0));

//	Inserisco in pannelloCampi la data iniziale, quella finale ed il testo di output:
//   Data START
	pannelloCampi.add(gS);
	pannelloCampi.add(ggStart);

	pannelloCampi.add(mS);
	pannelloCampi.add(mmStart);

	pannelloCampi.add(yS);
	pannelloCampi.add(yyStart);

//   Data END
	pannelloCampi.add(gE);
	pannelloCampi.add(ggEnd);

	pannelloCampi.add(mE);
	pannelloCampi.add(mmEnd);

	pannelloCampi.add(yE);
	pannelloCampi.add(yyEnd);

	// inserisco il pannelloCampi a nord dell'applet:
	pannelloApplet.add(pannelloCampi, BorderLayout.NORTH);

//	Definisco il pannello e gli Item che dovrà contenere:
	JPanel pannelloOut = new JPanel();
	pannelloOut.setLayout(new FlowLayout());

//   OutPut
	pannelloOut.add(Output);
	pannelloOut.add(testoOutput);

	pannelloApplet.add(pannelloOut, BorderLayout.CENTER);

	Receiver1 receiver1 = new Receiver1();
	Receiver2 receiver2 = new Receiver2();	//	ActionListener(s) 
	Receiver3 receiver3 = new Receiver3();	//- da implementare dopo questa classe -
	Receiver4 receiver4 = new Receiver4();
	Receiver5 receiver5 = new Receiver5();
	Receiver6 receiver6 = new Receiver6();

	//		assegnazione ActionListener(s) ai corrispondenti JButton(s)	assegnazione ActionListener(s) ai corrispondenti JButton(s)
	bottone[0].addActionListener(receiver1);
	bottone[1].addActionListener(receiver2);
	bottone[2].addActionListener(receiver3);
	bottone[3].addActionListener(receiver4);
	bottone[4].addActionListener(receiver5);
	bottone[5].addActionListener(receiver6);
	}

    // la classe che definisce il ricevitore di eventi usato 
    // dal bottone Componi data:
    class Receiver1 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

	String giorno = ggStart.getText ();
	String mese = mmStart.getText ();
	String anno = yyStart.getText ();

	testoOutput.setText(giorno + "/" + mese + "/" + anno + "<--------->" + anno + "/" + mese + "/" + giorno);
		}
	}

    // la classe che definisce il ricevitore di eventi usato 
    // dal bottone :
    class Receiver2 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

	Calendar cal = new GregorianCalendar();
	testoOutput.setText(cal.get(Calendar.DAY_OF_MONTH) + "/" + (cal.get(Calendar.MONTH)+1) + "/" + cal.get(Calendar.YEAR));
		}
	}

    // la classe che definisce il ricevitore di eventi usato 
    // dal bottone Controllo data:
    class Receiver3 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

	String SGiorno = ggStart.getText ();
	String SMese = mmStart.getText ();
	String SAnno = yyStart.getText ();

//Parsing:

	int day=Integer.parseInt(SGiorno);
	int month=Integer.parseInt(SMese);
	int year=Integer.parseInt(SAnno);

        GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
        cal.setLenient (false);

//Le stringhe sono oggetti "immutabili". Non esiste un metodo setText()
// né esiste un qualche altro metodo che modifica lo stato dell'oggetto String.

        try {
	cal.get (Calendar.DATE);
	      testoOutput.setText(day +"/"+ month +"/"+ year + ": data corretta.");

	} catch (IllegalArgumentException i) {
	      testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
	}
      }
    }

    // la classe che definisce il ricevitore di eventi usato 
    // dal bottone Aggiungi tempo:
    class Receiver4 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

	String SGiorno = ggStart.getText ();
	String SMese = mmStart.getText ();
	String SAnno = yyStart.getText ();

	String EGiorno = ggEnd.getText ();
	String EMese = mmEnd.getText ();
	String EAnno = yyEnd.getText ();

//Parsing:
	int day = Integer.parseInt(SGiorno);
	int month = Integer.parseInt(SMese);
	int year = Integer.parseInt(SAnno);

//Tempo da aggiungere
	int Agg = Integer.parseInt(EGiorno);
	int Amm = Integer.parseInt(EMese);
	int Ayy = Integer.parseInt(EAnno);

        GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
        cal.setLenient (true);

//Aggiunte
	cal.add(Calendar.DAY_OF_MONTH, Agg);
	cal.add(Calendar.MONTH, Amm + 1);
	cal.add(Calendar.YEAR, Ayy);

	testoOutput.setText(cal.get(Calendar.YEAR) + "/" + cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.DAY_OF_MONTH));

		}
	}

    // la classe che definisce il ricevitore di eventi usato 
    // dal bottone Controllo data:
    class Receiver5 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

		}
	}

    // la classe che definisce il ricevitore di eventi usato 
    // dal bottone :
    class Receiver6 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

		}
	}
}
 
  • Like
Reactions: ottofonsuppost
Sono riuscito a mettere a posto il problema, anche se come ho fatto non mi convince affatto...
Comunque posto qui di seguito il codice:
Codice:
...

    class Receiver4 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

        ...

        GregorianCalendar cal = new GregorianCalendar (year, month-1, day);

        ...

		}
	}

...

Scusa, ma è ovvio che non funziona, in pratica ti somma un mese in meno rispetto al valore che ti aspetti). Quando crei l'istanza di GregorianCalendar utilizzi month-1 per cui un mese in meno rispetto a quello inserito nella JTextField, per cui quando poi vai ad invocare il metodo add() ti ritrovi giustamente un mese in meno.
 
  • Like
Reactions: ottofonsuppost
Si,effettivamente sono un pò confuso sui mesi che cominciano da "0"...ora l'ho cambiato così:
Codice:
    class Receiver4 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

	String SGiorno = ggStart.getText ();
	String SMese = mmStart.getText ();
	String SAnno = yyStart.getText ();

	String EGiorno = ggEnd.getText ();
	String EMese = mmEnd.getText ();
	String EAnno = yyEnd.getText ();

//Parsing:
	int day = Integer.parseInt(SGiorno);
	int month = Integer.parseInt(SMese);
	int year = Integer.parseInt(SAnno);

//Tempo da aggiungere
	int Agg = Integer.parseInt(EGiorno);
	int Amm = Integer.parseInt(EMese);
	int Ayy = Integer.parseInt(EAnno);

        GregorianCalendar cal = new GregorianCalendar (year, month, day);
        cal.setLenient (true);

//Aggiunte
	cal.add(Calendar.DAY_OF_MONTH, Agg);
	cal.add(Calendar.MONTH, Amm);
	cal.add(Calendar.YEAR, Ayy);

	testoOutput.setText(cal.get(Calendar.YEAR) + "/" + cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.DAY_OF_MONTH));
ma se non immetto niente in uno dei campi Agg, Amm o Ayy (che sono i campi in cui immetto gli int da aggiungere) viene lanciata un'eccezione:

Exception in thread "AWT-EventQueue-1" java.lang.NumberFormatException: For input string: ""

Immagino che sia dovuto al fatto che un int non possa essere "", ma al massimo "0"...:book:
 
  • Like
Reactions: ottofonsuppost
Ok, quindi ho provato a cambiare il codice in questo modo:
Codice:
    // la classe che definisce il ricevitore di eventi usato 
    // dal bottone Aggiungi tempo:
    class Receiver4 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

	String SGiorno = ggStart.getText ();
	String SMese = mmStart.getText ();
	String SAnno = yyStart.getText ();

	String EGiorno = ggEnd.getText ();
	String EMese = mmEnd.getText ();
	String EAnno = yyEnd.getText ();

//Parsing:
	int day = Integer.parseInt(SGiorno);
	int month = Integer.parseInt(SMese);
	int year = Integer.parseInt(SAnno);

//Tempo da aggiungere
	int Agg = Integer.parseInt(EGiorno);
	int Amm = Integer.parseInt(EMese);
	int Ayy = Integer.parseInt(EAnno);

        GregorianCalendar cal = new GregorianCalendar (year, month, day);
        cal.setLenient (true);

//Aggiunte
	try {
	cal.add(Calendar.DAY_OF_MONTH, Agg);
	cal.add(Calendar.MONTH, Amm);
	cal.add(Calendar.YEAR, Ayy);

	testoOutput.setText(cal.get(Calendar.YEAR) + "/" + cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.DAY_OF_MONTH));

	} catch (NumberFormatException n) {
	testoOutput.setText("Per eseguire il comando, accertarsi che ogni campo di input sia valorizzato con almeno una cifra da 0 a 9 ");
			}
		}
ma l'errore continua a ripetersi...secondo te ho sbagliato qualcosa nel lancio dell'eccezione o devo mettere per default le stringhe a "0"?
 
  • Like
Reactions: ottofonsuppost
L'eccezione non si verifica lì dove hai messo il try catch. Se leggi la descrizione dell'eccezione sicuramente troverai la riga in cui essa si verifica.
La NumberFormatException viene causata dal fatto che tenti ci convertire in int una stringa che in realtà non contiene un valore numerico e ciò lo fai qui:

...

Codice:
...

//Parsing:
	int day = Integer.parseInt(SGiorno);
	int month = Integer.parseInt(SMese);
	int year = Integer.parseInt(SAnno);

//Tempo da aggiungere
	int Agg = Integer.parseInt(EGiorno);
	int Amm = Integer.parseInt(EMese);
	int Ayy = Integer.parseInt(EAnno);

...
...

Per cui è lì che devi inserire il try catch:

Codice:
...

try {

//Parsing:
	int day = Integer.parseInt(SGiorno);
	int month = Integer.parseInt(SMese);
	int year = Integer.parseInt(SAnno);

//Tempo da aggiungere
	int Agg = Integer.parseInt(EGiorno);
	int Amm = Integer.parseInt(EMese);
	int Ayy = Integer.parseInt(EAnno);

	GregorianCalendar cal = new GregorianCalendar (year, month, day);
        cal.setLenient (true);

	cal.add(Calendar.DAY_OF_MONTH, Agg);
	cal.add(Calendar.MONTH, Amm);
	cal.add(Calendar.YEAR, Ayy);

	testoOutput.setText(cal.get(Calendar.YEAR) + "/" + cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.DAY_OF_MONTH));

} catch (NumberFormatException n) {
	testoOutput.setText("Per eseguire il comando, accertarsi che ogni campo di input sia valorizzato con almeno una cifra da 0 a 9 ");
}

...
 
  • Like
Reactions: ottofonsuppost
Ah, ok, ora è giusto...avevo provato anche in un altro modo ma non me lo compilava, poi ho letto il tuo post e così funziona:
Codice:
    class Receiver4 implements ActionListener {
	public void actionPerformed(ActionEvent e) {

	String SGiorno = ggStart.getText ();
	String SMese = mmStart.getText ();
	String SAnno = yyStart.getText ();

	String EGiorno = ggEnd.getText ();
	String EMese = mmEnd.getText ();
	String EAnno = yyEnd.getText ();

	 try {
//Parsing:
	int day = Integer.parseInt(SGiorno);
	int month = Integer.parseInt(SMese);
	int year = Integer.parseInt(SAnno);

//Tempo da aggiungere
	int Agg = Integer.parseInt(EGiorno);
	int Amm = Integer.parseInt(EMese);
	int Ayy = Integer.parseInt(EAnno);

        GregorianCalendar cal = new GregorianCalendar (year, month, day);
        cal.setLenient (true);

//Aggiunte

	cal.add(Calendar.DAY_OF_MONTH, Agg);
	cal.add(Calendar.MONTH, Amm);
	cal.add(Calendar.YEAR, Ayy);

	testoOutput.setText(cal.get(Calendar.YEAR) + "/" + cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.DAY_OF_MONTH));

	} catch (NumberFormatException n) {
		testoOutput.setText("Per eseguire il comando \"Aggiungi tempo\" \n accertarsi che ogni campo di input sia valorizzato con almeno una cifra da 0 a 9 \n (quindi la data iniziale DEVE essere del tutto valorizzata,e \n se si vogliono aggiungere solo giorni, i campi mese ed anno devono essere a 0).");
Grazie mille satifal!! :beer:
 
  • Like
Reactions: ottofonsuppost

Discussioni simili