Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: ledestin/swing/YearsComboBoxModel.java


1   /*
2   * Copyright (C) 2000-2001 Dmitry Macsema.  All Rights Reserved.  
3   * 
4   * Redistribution and use in source and binary forms, with or without
5   * modification, are permitted under the terms of the following
6   * Open Source license:
7   *
8   * The GNU General Public License, version 2, or any later version, as
9   * published by the Free Software Foundation
10  * (http://www.fsf.org/copyleft/gpl.html);
11  */
12  
13  package ledestin.swing;
14  
15  import java.util.*;
16  import java.awt.*;
17  import java.awt.event.*;
18  import javax.swing.*;
19  
20  /**
21  The class provides a model for JComboBox allowing to select from a range of 
22  years. firstYear and lastYear properties can be set, confining the range of 
23  years.
24  */
25  public class YearsComboBoxModel extends AbstractListModel implements ComboBoxModel {
26    private Calendar firstYear = Calendar.getInstance();
27    private Calendar lastYear = Calendar.getInstance();
28    private int selectedYear;
29  
30    public YearsComboBoxModel(int firstYear, int lastYear) {
31      this.firstYear.set(Calendar.YEAR, firstYear);
32      this.lastYear.set(Calendar.YEAR, lastYear);
33      setSelectedYear(getLastYear());
34    }
35    public void setFirstYear(int firstYear) throws IllegalArgumentException {
36      if (firstYear < getLastYear()) {
37        int range = getFirstYear() - firstYear;
38        this.firstYear.set(Calendar.YEAR, firstYear);
39        int lastIndex = getSize() - 1;
40        if (range < 0) {
41          fireIntervalRemoved(this, lastIndex + 1, lastIndex - range);
42        } else if (range > 0) {
43          fireIntervalAdded(this, lastIndex - range + 1, lastIndex);
44        }
45      } else {
46        throw new IllegalArgumentException("First year must be less than last year");
47      }
48    }
49    public int getFirstYear() {
50      return firstYear.get(Calendar.YEAR);
51    }
52    public void setLastYear(int lastYear) throws IllegalArgumentException {
53      if (lastYear > getFirstYear()) {
54        int range = lastYear - getLastYear();
55        this.lastYear.set(Calendar.YEAR, lastYear);
56        int lastIndex = getSize() - 1;
57        if (range < 0) {
58          fireIntervalRemoved(this, 0, Math.abs(range) - 1);
59        } else if (range > 0) {
60          fireIntervalAdded(this, 0, Math.abs(range) - 1);
61        }
62      } else {
63        throw new IllegalArgumentException("Last year must be larger than first year");
64      }
65    }
66    public int getLastYear() {
67      return lastYear.get(Calendar.YEAR);
68    }
69    protected void setSelectedYear(int year) {
70      selectedYear = year;    
71    }
72    protected int getSelectedYear() {
73      return selectedYear;
74    }
75    
76    public Object getElementAt(int index) {
77      return String.valueOf(getLastYear() - index);
78    }
79    public int getSize() {
80      return getLastYear() - getFirstYear() + 1;
81    }
82    public void setSelectedItem(Object anItem) {
83      setSelectedYear(Integer.parseInt((String)anItem));
84    }
85    public Object getSelectedItem() {
86      return String.valueOf(getSelectedYear());
87    }
88  
89    public static void main(String[] args) throws Exception {
90      JFrame frame = new JFrame("YearsComboBoxModel Test");
91      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
92  
93      final YearsComboBoxModel yearsModel = new YearsComboBoxModel(1997, 2000);
94      JComboBox cb = new JComboBox(yearsModel);
95  
96      JLabel l1 = new JLabel("firstYear");
97      final JTextField firstYear = new JTextField();
98      firstYear.setText(String.valueOf(yearsModel.getFirstYear()));
99      JLabel l2 = new JLabel("lastYear");
100     final JTextField lastYear = new JTextField();
101     lastYear.setText(String.valueOf(yearsModel.getLastYear()));
102 
103     JButton btn = new JButton("Apply changes");
104     btn.addActionListener(new ActionListener() {
105       public void actionPerformed(ActionEvent e) {
106         yearsModel.setFirstYear(Integer.parseInt(firstYear.getText()));
107         yearsModel.setLastYear(Integer.parseInt(lastYear.getText()));
108       }
109     }
110     );
111     Container pane = frame.getContentPane();
112     pane.setLayout(new FlowLayout());
113     pane.add(cb);
114     pane.add(l1);
115     pane.add(firstYear);
116     pane.add(l2);
117     pane.add(lastYear);
118     pane.add(btn);
119     frame.pack();
120     frame.show();
121   }
122 }