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 }