Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Classe bisestile con jframe

    Salve ho fatto una classe Data che vuole (giorno mese,anno) con due metodi
    bisestile() : che dice se l'anno è bisestile (anche se c'è un errore perchè gli anni %100 che non sono anni%400 non sono bisestili).
    addgiorni(giornidaaggiungere): che restituisce la data aggiungendo i giorni.

    Questa è la classe:
    codice:
    public class Data {
    	private int giorno,mese,anno ;
    
    	public Data(int giorno, int mese, int anno) {
    		super();
    		this.giorno = giorno;
    		this.mese = mese;
    		this.anno = anno;
    	}
    	
    	public int get_mese(){
    		return mese;
    	}
    	
    	public String bisestile(){
    		String year ;
    		if (anno%4==0 &&  anno%400==0){
    			year="E' bisestile";
    		}
    		else{
    			year="Non è bisestile";
    		}
    		
    		return year;
    	}
    	
    	public void addDay(int giorni){
    		
    		giorno =giorno +giorni;
    		
    		if(mese==1 || mese ==3 || mese ==5 ||mese ==7 ||mese==8 ||mese ==10 ||mese ==12){
    			if(giorno>31){
    				mese=mese+1;
    				if(mese>12){
    					anno =anno+1;
    					mese = mese - 12 ;
    					
    				}
    				giorno= giorno-31;
    			}
    		}
    		else if(mese==4 || mese ==6 || mese ==9 ||mese ==11){
    			if(giorno>30){
    				mese=mese+1;
    				giorno= giorno-30;
    			}
    		}
    		
    		else if(mese==2){
    			
    			if(bisestile().equals("E' bisestile")){
    				if(giorno>29){
    					mese=mese+1;
    					giorno= giorno-29;
    				}
    			}
    			else{
    				if(giorno>28){
    					mese=mese+1;
    					giorno= giorno-28;
    
    			}
    			
    		}
    				
    		
    	    }
    		System.out.println("Aggiungeno i giorni la data diventa :" + giorno+ " " + mese +" "+anno+".");
         }
    Questa è la classe ProvaData:

    codice:
    public class ProvaData {
    
    	public static void main(String[] args) {
    		
    		Data d=new Data(1,2,2000);
    		System.out.println(d.bisestile());
    		d.addDay(35);
    
    	}
    
    }
    tutto funziona ....

    ora vorrei utilizzarla tramite jframe con windows builder ho fatto :
    codice:
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JTextField;
    import javax.swing.JButton;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    
    public class FinestraProvaData extends Data {
    
    	private JFrame frmDataAggiungiGiorni;
    	private JTextField txgiorno;
    	private JTextField txmese;
    	private JTextField txanno;
    	private JTextField txgiorniadd;
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				
    
    				try {
    					FinestraProvaData window = new FinestraProvaData();
    					window.frmDataAggiungiGiorni.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the application.
    	 */
    	public FinestraProvaData() {
    		super( giorno,  mese, anno);
    		initialize();
    	}
    
    	/**
    	 * Initialize the contents of the frame.
    	 */
    	private void initialize() {
    		frmDataAggiungiGiorni = new JFrame();
    		frmDataAggiungiGiorni.setTitle("Data Aggiungi Giorni");
    		frmDataAggiungiGiorni.setBounds(100, 100, 450, 300);
    		frmDataAggiungiGiorni.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frmDataAggiungiGiorni.getContentPane().setLayout(null);
    		
    		JLabel lblGiorno = new JLabel("Giorno");
    		lblGiorno.setBounds(28, 38, 56, 15);
    		frmDataAggiungiGiorni.getContentPane().add(lblGiorno);
    		
    		JLabel lblMese = new JLabel("Mese");
    		lblMese.setBounds(150, 38, 50, 15);
    		frmDataAggiungiGiorni.getContentPane().add(lblMese);
    		
    		txgiorno = new JTextField();
    		txgiorno.setColumns(10);
    		txgiorno.setBounds(91, 36, 56, 19);
    		frmDataAggiungiGiorni.getContentPane().add(txgiorno);
    		
    		txmese = new JTextField();
    		txmese.setColumns(10);
    		txmese.setBounds(195, 36, 56, 19);
    		frmDataAggiungiGiorni.getContentPane().add(txmese);
    		
    		txanno = new JTextField();
    		txanno.setColumns(10);
    		txanno.setBounds(313, 36, 56, 19);
    		frmDataAggiungiGiorni.getContentPane().add(txanno);
    		
    		JLabel lblAnno = new JLabel("Anno");
    		lblAnno.setBounds(265, 38, 56, 15);
    		frmDataAggiungiGiorni.getContentPane().add(lblAnno);
    		
    		JLabel lblInserireGiorniDa = new JLabel("Inserire Giorni da aggiungere alla data");
    		lblInserireGiorniDa.setBounds(28, 104, 281, 15);
    		frmDataAggiungiGiorni.getContentPane().add(lblInserireGiorniDa);
    		
    		txgiorniadd = new JTextField();
    		txgiorniadd.setBounds(313, 102, 50, 19);
    		frmDataAggiungiGiorni.getContentPane().add(txgiorniadd);
    		txgiorniadd.setColumns(10);
    		
    		JButton btnDimmiSe = new JButton("Dimmi se è bisestile e dimmi la nuva data");
    		btnDimmiSe.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				int g=Integer.parseInt(txgiorno.getText());
    				int m=Integer.parseInt(txmese.getText());
    				int a=Integer.parseInt(txanno.getText());
    				int gadd=Integer.parseInt(txgiorniadd.getText());
    				Data d=new Data(g,m,a);
    				JOptionPane.showMessageDialog(frmDataAggiungiGiorni, txgiorno.getText()+d.bisestile()+"La Nuova Data è:");
    				
    			}
    		});
    		btnDimmiSe.setBounds(48, 168, 340, 25);
    		frmDataAggiungiGiorni.getContentPane().add(btnDimmiSe);
    	}
    }
    Ora il bottone dovrebbe aprire una finestra e dirmi se l'anno è bisestile e la nuova data , i problemi sono 2 per utilizzare i metodi di Data ho dovuto estendere la classe FinestraProvaData ma ho problemi con il costruttore di super , inoltre non so copme usare il metodo addday() perchè eseguo un System.out.println quando avrei invece bisogno che mi restituisse tre int da utilizzare nella finestra del risultato.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Mi fermo alla tua classe "Data".
    Se esiste già in java si usa dire di "non reinventare la ruota".

    Con la classe Calendar facevi già tutto, operazioni e verifica del bisestile:
    codice:
    import java.util.Calendar;
    
    class Demo {
        public static void main(String[] args) {
            Calendar cal = Calendar.getInstance(); 
            
            cal.set(2000, Calendar.FEBRUARY, 28);
            cal.add(Calendar.DAY_OF_MONTH, 1);
            System.out.println(cal.get(Calendar.DAY_OF_MONTH) + "/" +
                               (cal.get(Calendar.MONTH) + 1) + "/" +
                               cal.get(Calendar.YEAR));
            System.out.println("bisestile: " +
                (cal.getActualMaximum(Calendar.DAY_OF_YEAR) > 365 ? "si" : "no"));
        }
    }

  3. #3
    Ma per me è didattica più che utilità quindi avrei bisogno di risolverla nell'altro modo.....

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Se la mettiamo sulla didattica però una funzione come la tua "public String bisestile" e utilizzata come bisestile().equals("E' bisestile") è veramente terribile.
    Bisestile è un boolean... quindi:

    codice:
    public boolean bisestile() {    
       return anno % 4 == 0 && (anno % 100 != 0 || anno % 400 == 0);
    }
    La condizione l'ho presa da: http://it.wikipedia.org/wiki/Anno_bisestile

  5. #5
    E' perchè l'ho creata precedentemente senza prendere spunto da niente e poichè bisestile() ritona una strimnga ho pensato di utilizzare qualcosa che avevo già fatto infatti come vedi non ho utilizzato
    codice:
    (anno % 100 != 0 || anno % 400 == 0)
    perchè non ci avevo pensato .
    Comunque si può arrivare a qualcosa con quello che ho già scritto?

    Altra domanda OT posso far ritornare un metodo di tipo x come diversi valori di tipo x
    es:
    int a ,b,c.
    int metodo(){
    return a,b,c;
    }
    o c'è un modo per ottenere lo stesso risultato?

    Scusate ma sono all'inizio ed è bene chiarire subito i dubbi....

  6. #6
    Beh intanto non capisco perché in FinestraProvaData estendi Data quando non c'è ne bisogno.
    Inoltre in Data richiami super() quando:
    1) non estendi alcuna classe in Data
    2) non c'è nessun costruttore vuoto da poter richiamare.

    Rileggi bene il manuale vedo che qualche concetto non ti è molto chiaro.

    Quello che hai chiesto non si può fare ma puoi ovviare al problema.

    Ti crei un oggetto(per convezione chiamiamolo abc) con i tre valori che ti vuoi riportare che contenga al suo interno almeno i metodo getter e poi invece di fare

    return a, b, c;
    fai
    return abc;

    e poi con i metodi getter ti ritorni i valori.

    abc.getA();
    abc.getB();
    abc.getC();



    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  7. #7
    Per quanto riguarda super vuoto nella classe data è eclipse che lo aggiunge in automatico quando gli fai creare a lui il costruttore quindi è un errore autogenerato.

    Per quanto riguarda l'estendere data in FinestraProvaData , come faccio ad utilizzare i metodi di Data se non la estendo?

    Per quanto riguarda il ritornare abc , nel mio caso giornomeseanno(viene es. 10112012 cioè mi concatena i tre risultati?) poi posso recuperare con substring facendo casting int to string ,poi il substring ?

  8. #8
    Non è necessario estendere la classe(Ma hai letto qualche manuale?)
    Basta che sia nel progetto.
    Nel caso faccia parte di un'altro package devi dichiararlo negli import.

    Quello che vuoi fare è fattibile ma in una programmazione ad oggetti è qualcosa di terribile.
    E se il mese fosse di due cifre( novembre e gennaio ad esempio) come fai a capire quante cifre devi prendere?
    Ripeto la soluzione con un entity class è la migliore da adottare.

    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  9. #9
    HO risolto così :


    Classe Data :

    codice:
    public class Data {
    	private int giorno,mese,anno ;
    
    	public Data(int giorno, int mese, int anno) {
    		
    		this.giorno = giorno;
    		this.mese = mese;
    		this.anno = anno;
    	}
    	
    	public int get_mese(){
    		return mese;
    	}
    	
    	public String bisestile(){
    		String year ;
    		if (anno%4==0 && ( anno%400==0 || anno/100!=0)){
    			year="e' bisestile";
    		}
    		else{
    			year="non è bisestile";
    		}
    		
    		return year;
    	}
    	
    	public String addDay(int giorni){
    		
    		giorno =giorno +giorni;
    		
    		if(mese==1 || mese ==3 || mese ==5 ||mese ==7 ||mese==8 ||mese ==10 ||mese ==12){
    			if(giorno>31){
    				mese=mese+1;
    				if(mese>12){
    					anno =anno+1;
    					mese = mese - 12 ;
    					
    				}
    				giorno= giorno-31;
    			}
    		}
    		else if(mese==4 || mese ==6 || mese ==9 ||mese ==11){
    			if(giorno>30){
    				mese=mese+1;
    				giorno= giorno-30;
    			}
    		}
    		
    		else if(mese==2){
    			
    			if(bisestile().equals("E' bisestile")){
    				if(giorno>29){
    					mese=mese+1;
    					giorno= giorno-29;
    				}
    			}
    			else{
    				if(giorno>28){
    					mese=mese+1;
    					giorno= giorno-28;
    
    			}
    			
    		}
    				
    		
    	    }
            return giorno + "/" + mese + "/" + anno;     }
    }
    FinestraProvaData
    codice:
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JTextField;
    import javax.swing.JButton;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    
    public class FinestraProvaData  {
    
    	private JFrame frmDataAggiungiGiorni;
    	private JTextField txgiorno;
    	private JTextField txmese;
    	private JTextField txanno;
    	private JTextField txgiorniadd;
    
    	/**
    	 * Launch the application.
    	 */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				
    
    				try {
    					FinestraProvaData window = new FinestraProvaData();
    					window.frmDataAggiungiGiorni.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
    
    	/**
    	 * Create the application.
    	 */
    	public FinestraProvaData() {
    		initialize();
    	}
    
    	/**
    	 * Initialize the contents of the frame.
    	 */
    	private void initialize() {
    		frmDataAggiungiGiorni = new JFrame();
    		frmDataAggiungiGiorni.setTitle("Data Aggiungi Giorni");
    		frmDataAggiungiGiorni.setBounds(100, 100, 450, 300);
    		frmDataAggiungiGiorni.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frmDataAggiungiGiorni.getContentPane().setLayout(null);
    		
    		JLabel lblGiorno = new JLabel("Giorno");
    		lblGiorno.setBounds(28, 38, 56, 15);
    		frmDataAggiungiGiorni.getContentPane().add(lblGiorno);
    		
    		JLabel lblMese = new JLabel("Mese");
    		lblMese.setBounds(150, 38, 50, 15);
    		frmDataAggiungiGiorni.getContentPane().add(lblMese);
    		
    		txgiorno = new JTextField();
    		txgiorno.setColumns(10);
    		txgiorno.setBounds(91, 36, 56, 19);
    		frmDataAggiungiGiorni.getContentPane().add(txgiorno);
    		
    		txmese = new JTextField();
    		txmese.setColumns(10);
    		txmese.setBounds(195, 36, 56, 19);
    		frmDataAggiungiGiorni.getContentPane().add(txmese);
    		
    		txanno = new JTextField();
    		txanno.setColumns(10);
    		txanno.setBounds(313, 36, 56, 19);
    		frmDataAggiungiGiorni.getContentPane().add(txanno);
    		
    		JLabel lblAnno = new JLabel("Anno");
    		lblAnno.setBounds(265, 38, 56, 15);
    		frmDataAggiungiGiorni.getContentPane().add(lblAnno);
    		
    		JLabel lblInserireGiorniDa = new JLabel("Inserire Giorni da aggiungere alla data");
    		lblInserireGiorniDa.setBounds(28, 104, 281, 15);
    		frmDataAggiungiGiorni.getContentPane().add(lblInserireGiorniDa);
    		
    		txgiorniadd = new JTextField();
    		txgiorniadd.setBounds(313, 102, 50, 19);
    		frmDataAggiungiGiorni.getContentPane().add(txgiorniadd);
    		txgiorniadd.setColumns(10);
    		
    		JButton btnDimmiSe = new JButton("Dimmi se è bisestile e dimmi la nuva data");
    		btnDimmiSe.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				int g=Integer.parseInt(txgiorno.getText());
    				int m=Integer.parseInt(txmese.getText());
    				int a=Integer.parseInt(txanno.getText());
    				int gadd=Integer.parseInt(txgiorniadd.getText());
    				Data d=new Data(g,m,a);
    				JOptionPane.showMessageDialog(frmDataAggiungiGiorni, a+" "+d.bisestile()+" . La Nuova Data è:"+d.addDay(gadd));
    				
    			}
    		});
    		btnDimmiSe.setBounds(48, 168, 340, 25);
    		frmDataAggiungiGiorni.getContentPane().add(btnDimmiSe);
    	}
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.