Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Ciao Andrea, non ti lascio più in pace

    Volevo realizzare uno JSpinner con l'orario
    e far in modo che questo incrementasse o
    diminuisse l'orario a step di 15 minuti.

    Ho preso spunto da un tuo codice: thread

    ... questo è il mio:
    codice:
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY,7);
    Date iniziale = cal.getTime();
    cal.set(Calendar.HOUR_OF_DAY,0);
    Date min = cal.getTime();
    cal.set(Calendar.HOUR_OF_DAY,24);
    Date max = cal.getTime();
    		
    SpinnerDateModel dataModel = new SpinnerDateModel(iniziale,min,max,Calendar.MINUTE);// iniziale,min,max,step
    JSpinner orarioStart = new JSpinner(dataModel);
    orarioStart.setEditor(new JSpinner.DateEditor(orarioStart, "HH:mm"));
    getFormat(orarioStart,4); // JSpinner, colonne	
    orarioStart.addChangeListener(new ActionSpinner());
    
    [..........]
    
    
    // ACTION SPINNER
    private class ActionSpinner implements ChangeListener {
    	public void stateChanged(ChangeEvent ae) {
    		JSpinner spinner = (JSpinner) ae.getSource();
    		
    		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
    		Date d = (Date)spinner.getValue();
    		String formatted = sdf.format(d);
    		    
    	        System.err.println(formatted+ " "+spinner.getValue());
    	}
    } // FINE ACTION
    Quello che ottengo però è uno JSpinner che visuallizza l'ora minima da me settata
    e i minuti correnti del sistema ma non fa nessuna operazione, non aumenta o
    diminuisce di un minuto!!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Sarebbe stato meglio aprire un altro thread, visto che si parla di altro argomento... ad ogni modo, dovresti sbatterti un po' con la documentazione ed i tutorial... ad esempio, mettendo insieme un po' di cose trovate qui e lì in internet e sul sito della oracle ho prodotto:

    codice:
    private class MySpinnerDateModel extends SpinnerDateModel {
            
            private Date startDate, earliestDate, endDate;
            private int field;
            GregorianCalendar cal = new GregorianCalendar();
            GregorianCalendar tempCal = new GregorianCalendar();
            
            public Object getNextValue()  {
                
                Date actualDate = this.getDate();
                cal.setTime(actualDate);
                
                tempCal.setTime(actualDate);
                tempCal.add(field, 15);
                                                      
                if (!tempCal.getTime().after(endDate)) {                
                    cal.add(field, 15);
                }
                
                return cal.getTime();  
            } 
            
            public Object getPreviousValue() {
                
                Date actualDate = this.getDate();
                cal.setTime(actualDate);
                
                tempCal.setTime(actualDate);
                tempCal.add(field, -15);
                                                      
                if (!tempCal.getTime().before(earliestDate)) {                
                    cal.add(field, -15);
                }
                
                return cal.getTime();
            }
            
            public MySpinnerDateModel(Date startDate, Date earliestDate, Date endDate, int field) {
                super(startDate, earliestDate, endDate, field);
                this.startDate = startDate;
                this.earliestDate = earliestDate;
                this.endDate = endDate;
                this.field = field;
            }
        }
    
    public JSpinner JSpinnerTime() {
            GregorianCalendar calendar = new GregorianCalendar();
            calendar.setTime(new Date(0));
            calendar.set(Calendar.HOUR_OF_DAY, 7);
            calendar.set(Calendar.MINUTE, 0);        
            Date earliestDate = calendar.getTime();
            
            calendar.set(Calendar.HOUR_OF_DAY, 22);
            calendar.set(Calendar.MINUTE, 0);
            Date latestDate = calendar.getTime();
            
            calendar.set(Calendar.HOUR_OF_DAY, 15);
            calendar.set(Calendar.MINUTE, 0);
            Date startDate = calendar.getTime();        
            
            JSpinner spinner = new JSpinner(new MySpinnerDateModel(startDate, earliestDate, latestDate, Calendar.MINUTE));
            spinner.setEditor(new JSpinner.DateEditor(spinner, "HH:mm"));
            return spinner;
            
                    
        }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Ho provveduto a separare il nuovo problema in una nuova discussione.
    Ciascun problema va affrontato in una discussione separata, altrimenti è il caos più totale.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    non mi sono soffermato a spiegare quel che fa quel codice...

    allora innanzitutto, non c'è una vera ragione per cui ho scritto un metodo che ritorna uno JSpinner se non per pigrizia (avevo già una classe test con l'ossatura di quel metodo).

    Venendo alla ciccia:
    il new Date(0) l'ho derivato da una piccola ricerchina: apparentemente c'è qualche problema nella gestione di SpinnerDateModel (si incasina nelle gestione delle date in assenza di anno per via della gestione interna che apparentemente è legata ad Epoch, proprio in assenza di anno), comunque trattandosi di un JSpinner che giochicchia con ore e minuti ci è di poco interesse

    - Creo il mio JSpinner attaccandogli come modello un'istanza di una mia versione di SpinnerDateModel.

    Venendo alla classe privata che estende SpinnerDateModel: i metodi che ci interessano sono quelli che generano gli scatti successivo e precedente, ovvero quello che avviene alla pressione delle freccette di modifica.

    Il doppio calendario lo uso solo per pigrizia: uno (tempCal) è libero di essere modificato come gli pare, l'altro (cal) che invece rispecchia l'orario del JSpinner e che quindi deve sottostare ai vincoli imposti, viene modificato solo se la modifica (testata su tempCal) ricade nell'intervallo di validità.

    Nel tuo caso specifico, si sarebbe anche potuto omettere "field" ed esplicitarlo in Calendar.MINUTE, ma se domani volessi riutilizzare il tutto incrementando le ore a 2 a 2, ti basterà modificare meno codice... anzi portando il 15 a non essere hard-coded, ovvero inserendolo in una variabile "incremento", ti basterebbe modificare una sola riga.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Grazie per la risposta e mi scuso per non aver aperto un nuovo thread;
    quindi non era una cosa poi così semplice! non ce l'avrei fatta con le mie conoscenze!!

    Ecco come ho impostato il codice....

    ....ho messo il tuo codice nella Classe SpinnerOrario():
    codice:
    package utility;
    
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    
    import javax.swing.JSpinner;
    import javax.swing.SpinnerDateModel;
    
    public class SpinnerOrario extends JSpinner {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	
    	private class MySpinnerDateModel extends SpinnerDateModel {
    	        
    	        /**
    		 * 
    		 */
    		private static final long serialVersionUID = 1L;
    		
    		private Date earliestDate, endDate;
    	    private int field;
    	    GregorianCalendar cal = new GregorianCalendar();
    	    GregorianCalendar tempCal = new GregorianCalendar();
    	    
    	    public Object getNextValue()  {
    	        
    	        Date actualDate = this.getDate();
    	        cal.setTime(actualDate);
    	        
    	        tempCal.setTime(actualDate);
    	        tempCal.add(field, 15);
    	                                              
    	        if (!tempCal.getTime().after(endDate)) {                
    	            cal.add(field, 15);
    	        }
    	        
    	        return cal.getTime();  
    	    } // FINE METODO
    	    
    	    public Object getPreviousValue() {
    	        
    	        Date actualDate = this.getDate();
    	        cal.setTime(actualDate);
    	        
    	        tempCal.setTime(actualDate);
    	        tempCal.add(field, -15);
    	                                              
    	        if (!tempCal.getTime().before(earliestDate)) {                
    	            cal.add(field, -15);
    	        }
    	        
    	        return cal.getTime();
    	    } // FINE METODO
    	    
    	    public MySpinnerDateModel(Date startDate, Date earliestDate, Date endDate, int field) {
    	        super(startDate, earliestDate, endDate, field);
    	        this.earliestDate = earliestDate;
    	        this.endDate = endDate;
    	        this.field = field;
    	    } // FINE COSTRUTTORE
    	} // FINE PRIVATE CLASS
    
    	public SpinnerOrario() {
    		GregorianCalendar calendar = new GregorianCalendar();
    	    calendar.setTime(new Date(0));
    	    calendar.set(Calendar.HOUR_OF_DAY, 0);
    	    calendar.set(Calendar.MINUTE, 0);        
    	    Date earliestDate = calendar.getTime();
    	    
    	    calendar.set(Calendar.HOUR_OF_DAY, 24);
    	    calendar.set(Calendar.MINUTE, 0);
    	    Date latestDate = calendar.getTime();
    	    
    	    calendar.set(Calendar.HOUR_OF_DAY, 7);
    	    calendar.set(Calendar.MINUTE, 0);
    	    Date startDate = calendar.getTime();        
    	    	    
    	    setModel(new MySpinnerDateModel(startDate, earliestDate, latestDate, Calendar.MINUTE));
    	    setEditor(new JSpinner.DateEditor(this, "HH:mm"));	    
    	} // FINE COSTRUTTORE
    
    } // FINE CLASSE
    Così da creare i miei JSpinner per l'orario in altre Classi....
    codice:
    JSpinner orarioStart = new SpinnerOrario();
    getFormat(orarioStart,4); // JSpinner, colonne	
    orarioStart.addChangeListener(new ActionSpinner());
    Pensavo di inserire un parametro per variare in base alle esigenze lo step dell'orario,
    o altri parametri per variare i valori min, max e iniziale,
    comunque, come sempre, il codice funziona alla grande.

    Devo studiarmi il puntatore super,
    non ho capito bene gli usi.

    PS: Eclipse mi ha "suggerito" di cancellare questa riga:
    codice:
    this.startDate = startDate;
    Sempre gentilissimo, grazie

  6. #6
    Piccola correzione sul codice della latestDate,
    non posso mettere come valore max 24:00 !!!
    Così imposto a 23:59

    codice:
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    Date latestDate = calendar.getTime();

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    PS: Eclipse ti ha suggerito di eliminare startDate perché nel copiare il mio codice te lo sei dimenticato (dichiarazioni iniziali). Vabbhè che poi nella logica non ne faccio più uso, ma è parte integrante degli argomenti del costruttore e per qualsiasi ragione potresti voler poter modificare quell'attributo o averne il controllo. Vedi te se eliminarlo.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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.