Ordinare le date

di il
15 risposte

15 Risposte - Pagina 2

  • Re: Ordinare le date

    Come promesso, ecco qui un semplice esempio per un combo box model "sorted" (ordinato) per date Calendar.

    Questa è la implementazione del ComboBoxModel:
    import java.text.DateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Collections;
    import java.util.List;
    import javax.swing.AbstractListModel;
    import javax.swing.ComboBoxModel;
    
    public class SortedDateComboBoxModel extends AbstractListModel implements ComboBoxModel {
        private List<DateItem> dateItems;
        private DateFormat dateFormat;
        private Object selectedItem;
    
        public SortedDateComboBoxModel(DateFormat dateFormat) {
            dateItems = new ArrayList<DateItem>();
            this.dateFormat = dateFormat;
        }
    
        @Override
        public int getSize() {
            return dateItems.size();
        }
    
        @Override
        public Object getElementAt(int index) {
            return dateItems.get(index);
        }
    
        @Override
        public Object getSelectedItem() {
            return selectedItem;
        }
    
        @Override
        public void setSelectedItem(Object item) {
            if ((selectedItem != null && !selectedItem.equals(item)) ||
                    selectedItem == null && item != null) {
                selectedItem = item;
                fireContentsChanged(this, -1, -1);
            }
        }
    
    
        // Metodi extra
    
        public void addDate(Calendar calendar) {
            DateItem dateItem = new DateItem(calendar);
    
            int index = Collections.binarySearch(dateItems, dateItem);
    
            if (index < 0) {
                index = -index - 1;
            }
    
            dateItems.add(index, dateItem);
            fireIntervalAdded(this, index, index);
        }
    
        // altri metodi extra possibili: getDateAt, clear, removeDateAt, setDateFormat, ecc....
    
    
        private class DateItem implements Comparable<DateItem> {
            private Calendar calendar;
            private String formattedDate;
    
            public DateItem(Calendar calendar) {
                setCalendar(calendar);
            }
    
            public Calendar getCalendar() {
                return calendar;
            }
    
            public void setCalendar(Calendar calendar) {
                this.calendar = calendar;
                updateFormattedDate();
            }
    
            public void updateFormattedDate() {
                formattedDate = dateFormat.format(calendar.getTime());
            }
    
            public String toString() {
                return formattedDate;
            }
    
            @Override
            public int compareTo(DateItem otherItem) {
                return getCalendar().compareTo(otherItem.getCalendar());
            }
        }
    }
    E questo è un semplice frame di test:
    import java.awt.BorderLayout;
    import java.text.DateFormat;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    import javax.swing.WindowConstants;
    
    public class SortedDateComboDemoFrame extends JFrame {
        private SortedDateComboBoxModel model;
        private JComboBox dateComboBox;
    
        public SortedDateComboDemoFrame() {
            super("Sorted Date Combo Demo Frame");
    
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(400, 300);
            setLocationRelativeTo(null);
    
            DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);
    
            model = new SortedDateComboBoxModel(df);
            dateComboBox = new JComboBox(model);
    
            model.addDate(new GregorianCalendar(2015, Calendar.MARCH, 10));
            model.addDate(new GregorianCalendar(2015, Calendar.MARCH, 25));
            model.addDate(new GregorianCalendar(2015, Calendar.FEBRUARY, 9));
            model.addDate(new GregorianCalendar(2015, Calendar.JULY, 18));
            model.addDate(new GregorianCalendar(2015, Calendar.JANUARY, 5));
            model.addDate(new GregorianCalendar(2015, Calendar.MARCH, 22));
    
            getContentPane().add(dateComboBox, BorderLayout.NORTH);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new SortedDateComboDemoFrame().setVisible(true);
                }
            });
        }
    }
    Le date di test sono inserite "a casaccio" ma nella combo risultano ordinate. Anche se in seguito, a fronte di un evento, si aggiunge una data con il addDate, essa verrà inserita nel punto "giusto" per mantenere l'ordine.

    Ovviamente il model che ho fatto è abbastanza basilare e sarebbe altamente espandibile con altri metodi aggiuntivi (vedi quelli che ho citato nel codice).
Devi accedere o registrarti per scrivere nel forum
15 risposte