Hello,
I have been writing a Swing application and I am under obligation to
use a date picking component. In pure java Swing there are no such
components. Because my application will be used in commercial
environment it must be for free. I have found one useful component on
GNU LGPL Licence - JCalendar (
http://www.toedter.com/en/jcalendar/
index.html). Others, which I have found were not free. Maybe someone
of you had similar problem and found a good solution.
Best regards,
Waldek
This is a work in progress but you are welcome to it. Please if you
make any good modifications to it, send them to me so I can continue to
improve it.
//
//
//
// JDateChooser
//
// Written by: Knute Johnson
//
// Date Version Modification
// --------- -------
---------------------------------------------------
// 04 jun 05 01.00 incept
//
//
// Constructor Summary
// JDateChooser()
// Creates a new JDateChooser with today's date displayed
// JDateChooser(GregorianCalendar gc)
// Creates a new JDateChooser with the specified date displayed
//
// Method Summary
// GregorianCalendar getCalendar()
// Gets the selected date
// void setCalendar(GregorianCalendar gc)
// Sets and display's the specified date
// static GregorianCalendar showDialog(Component comp)
// Displays a JDateChooser in a modal JDialog and returns the
// selected date or null if dismissed.
// static GregorianCalendar showDialog(Component
comp,GregorianCalendar gc)
// Displays a JDateChooser in a modal JDialog with the
specified date
// and returns the selected date or null if dismissed.
//
//
//
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
public class JDateChooser extends JComponent {
/*
private static final String[] dayStr =
{"SUN","MON","TUE","WED","THU","FRI","SAT"};
*/
private final String[] dayStr;
private final String[] monthStr;
/*
private static final String[] monthStr =
{"JANUARY ","FEBRUARY ","MARCH ","APRIL ","MAY ","JUNE ","JULY ",
"AUGUST ","SEPTEMBER ","OCTOBER ","NOVEMBER ","DECEMBER "};
*/
private GregorianCalendar gc;
private int thisYear,thisMonth,today;
private int selectedDay;
private JButton previousButton,nextButton;
private JLabel[] dayOfWeekLabels = new JLabel[7];
private JLabel[] dayOfMonthLabels = new JLabel[42];
private JLabel monthYearLabel;
private static JDialog dialog;
private static GregorianCalendar retcod;
private final Locale locale;
public JDateChooser() {
this(new GregorianCalendar(),Locale.getDefault());
}
public JDateChooser(GregorianCalendar calendar, Locale locale) {
gc = calendar;
thisYear = gc.get(Calendar.YEAR);
thisMonth = gc.get(Calendar.MONTH);
today = selectedDay = gc.get(Calendar.DAY_OF_MONTH);
this.locale = locale;
DateFormatSymbols dfs = DateFormatSymbols.getInstance(locale);
monthStr = dfs.getMonths();
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = c.gridy = 0; c.insets = new Insets(2,2,2,2);
c.weightx = 1.0;
c.anchor = GridBagConstraints.WEST;
previousButton = new JButton("<");
previousButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
gc.add(Calendar.MONTH,-1);
int mon = gc.get(Calendar.MONTH);
if (selectedDay >
gc.getActualMaximum(Calendar.DAY_OF_MONTH))
selectedDay = 1;
drawCalendar();
}
});
add(previousButton,c);
++c.gridx; c.anchor = GridBagConstraints.CENTER;
monthYearLabel = new JLabel(" ",JLabel.CENTER);
add(monthYearLabel,c);
++c.gridx; c.anchor = GridBagConstraints.EAST;
nextButton = new JButton(">");
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
gc.add(Calendar.MONTH,1);
int mon = gc.get(Calendar.MONTH);
if (selectedDay >
gc.getActualMaximum(Calendar.DAY_OF_MONTH))
selectedDay = 1;
drawCalendar();
}
});
add(nextButton,c);
MouseListener ml = new MouseAdapter() {
public void mouseClicked(MouseEvent me) {
JLabel dayLabel = (JLabel)me.getSource();
String str = dayLabel.getText();
try {
int num = Integer.parseInt(str);
gc.set(Calendar.DAY_OF_MONTH,num);
selectedDay = num;
drawCalendar();
} catch (NumberFormatException nfe) {
}
}
};
c.gridx = 0; ++c.gridy; c.gridwidth = 3;
c.anchor = GridBagConstraints.CENTER;
JPanel panel = new JPanel(new GridLayout(7,7,1,1));
/*
for (int i=0; i<dayStr.length; i++) {
dayOfWeekLabels
= new JLabel(dayStr,JLabel.CENTER);
panel.add(dayOfWeekLabels);
}
*/
dayStr = dfs.getShortWeekdays();
int firstDay = gc.getFirstDayOfWeek();
for (int i=0; i<7; i++) {
int x = firstDay + i;
if (i == 6)
x = firstDay == Calendar.MONDAY ? Calendar.SUNDAY :
Calendar.SATURDAY;
dayOfWeekLabels =
new JLabel(dayStr[x].toUpperCase(),JLabel.CENTER);
panel.add(dayOfWeekLabels);
}
for (int i=0; i<dayOfMonthLabels.length; i++) {
dayOfMonthLabels = new JLabel(" ",JLabel.CENTER);
dayOfMonthLabels.setOpaque(true);
dayOfMonthLabels.addMouseListener(ml);
panel.add(dayOfMonthLabels);
}
drawCalendar();
add(panel,c);
}
private void drawCalendar() {
int month = gc.get(Calendar.MONTH);
int year = gc.get(Calendar.YEAR);
monthYearLabel.setText(monthStr[month].toUpperCase() + " " +
Integer.toString(year));
gc.set(Calendar.DAY_OF_MONTH,1);
int firstDayOfMonth = gc.get(Calendar.DAY_OF_WEEK);
if (gc.getFirstDayOfWeek() == Calendar.MONDAY)
--firstDayOfMonth;
gc.set(Calendar.DAY_OF_MONTH,selectedDay);
int day = 1;
for (int i=0; i<42; i++) {
if (i >= (firstDayOfMonth - 1) &&
i<(gc.getActualMaximum(Calendar.DAY_OF_MONTH)+firstDayOfMonth-1)) {
dayOfMonthLabels.setText(Integer.toString(day));
if (day == today && month == thisMonth && year == thisYear)
dayOfMonthLabels.setForeground(Color.RED);
else
dayOfMonthLabels.setForeground(Color.BLACK);
if (day == selectedDay)
dayOfMonthLabels.setBackground(new Color(0xa0a0a0));
else
dayOfMonthLabels.setBackground(Color.WHITE);
++day;
} else {
dayOfMonthLabels.setText(" ");
dayOfMonthLabels.setBackground(new Color(0xe0e0e0));
}
}
}
public GregorianCalendar getCalendar() {
return new GregorianCalendar(gc.get(Calendar.YEAR),
gc.get(Calendar.MONTH),selectedDay);
}
public void setCalendar(GregorianCalendar calendar) {
gc = calendar;
drawCalendar();
}
public static GregorianCalendar showDialog(Component comp) {
return showDialog(comp, new
GregorianCalendar(),Locale.getDefault());
}
public static GregorianCalendar showDialog(Component comp,
GregorianCalendar calendar,Locale locale) {
GridBagConstraints c = new GridBagConstraints();
c.gridx = c.gridy = 0; c.insets = new Insets(2,2,2,2);
c.gridwidth = 2;
JFrame f = new JFrame();
dialog = new JDialog(f,"Select Date",true);
dialog.setLayout(new GridBagLayout());
dialog.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
retcod = null;
}
});
final JDateChooser dc = new JDateChooser(calendar,locale);
dialog.add(dc,c);
++c.gridy; c.gridwidth = 1; c.anchor = GridBagConstraints.WEST;
JButton okButton = new JButton(" OK ");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
retcod = dc.getCalendar();
dialog.dispose();
}
});
dialog.add(okButton,c);
++c.gridx; c.anchor = GridBagConstraints.EAST;
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
retcod = null;
dialog.dispose();
}
});
dialog.add(cancelButton,c);
dialog.pack();
dialog.setLocationRelativeTo(comp);
dialog.setVisible(true);
return retcod;
}
public void setFont(Font font) {
previousButton.setFont(font);
nextButton.setFont(font);
for (int i=0; i<dayOfWeekLabels.length; i++)
dayOfWeekLabels.setFont(font);
for (int i=0; i<dayOfMonthLabels.length; i++)
dayOfMonthLabels.setFont(font);
monthYearLabel.setFont(font);
}
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
final JDateChooser dc = new JDateChooser();
final JFrame f = new JFrame();
f.setLayout(new FlowLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(dc);
final JButton b = new JButton("DateChooser");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println(showDialog(b,new
GregorianCalendar(Locale.FRANCE),Locale.FRANCE));
}
});
f.add(b);
f.pack();
f.setVisible(true);
}
};
EventQueue.invokeLater(r);
}
}