Swing - Date picker etc.

Discussion in 'Java' started by wbrzozow@gmail.com, Apr 21, 2008.

  1. Guest

    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
     
    , Apr 21, 2008
    #1
    1. Advertising

  2. wrote:
    > 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);
    }
    }

    --

    Knute Johnson
    email s/nospam/linux/

    --
    Posted via NewsDemon.com - Premium Uncensored Newsgroup Service
    ------->>>>>>http://www.NewsDemon.com<<<<<<------
    Unlimited Access, Anonymous Accounts, Uncensored Broadband Access
     
    Knute Johnson, Apr 22, 2008
    #2
    1. Advertising

  3. 1 connu Guest

    Hi Knute,

    You have to change :

    DateFormatSymbols dfs = new DateFormatSymbols(locale);

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

    Pierre
     
    1 connu, Apr 22, 2008
    #3
  4. Guest

    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.
     
    , Apr 23, 2008
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. TB
    Replies:
    0
    Views:
    453
  2. Peter Grison

    Date, date date date....

    Peter Grison, May 28, 2004, in forum: Java
    Replies:
    10
    Views:
    3,271
    Michael Borgwardt
    May 30, 2004
  3. bala2008
    Replies:
    0
    Views:
    648
    bala2008
    Jun 27, 2008
  4. Kevin Walzer

    Re: PIL (etc etc etc) on OS X

    Kevin Walzer, Aug 1, 2008, in forum: Python
    Replies:
    4
    Views:
    410
    Fredrik Lundh
    Aug 13, 2008
  5. Replies:
    0
    Views:
    197
Loading...

Share This Page