Swing - Date picker etc.

W

wbrzozow

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
 
K

Knute Johnson

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);
}
}
 
1

1 connu

Hi Knute,

You have to change :

DateFormatSymbols dfs = new DateFormatSymbols(locale);

and add many getContentPane() to frames and dialog to make it work

Pierre
 
W

wbrzozow

Thanks for help,
Finally, I have found SwingX (www.swinglabs.org). It is exactly what I
need. These components extend Swing components and provide new
functionality. I used JXDatePicker, JXTaskPane in my application and I
recommend to use its.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
473,991
Messages
2,570,217
Members
46,805
Latest member
ClydeHeld1

Latest Threads

Top