java Swing 日期选择器

源码展示(网上转帖代码)


import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager2;
import java.util.Enumeration;

public class AbsoluteLayout implements LayoutManager2, java.io.Serializable {
 static final long serialVersionUID = -1919857869177070440L;
 protected java.util.Hashtable constraints = new java.util.Hashtable();

 public void addLayoutComponent(String name, Component comp) {
  throw new IllegalArgumentException();
 }

 public void removeLayoutComponent(Component comp) {
  constraints.remove(comp);
 }

 public Dimension preferredLayoutSize(Container parent) {
  int maxWidth = 0;
  int maxHeight = 0;
  for (java.util.Enumeration e = constraints.keys(); e.hasMoreElements();) {
   Component comp = (Component) e.nextElement();
   AbsoluteConstraints ac = (AbsoluteConstraints) constraints
     .get(comp);
   Dimension size = comp.getPreferredSize();
   int width = ac.getWidth();
   if (width == -1)
    width = size.width;
   int height = ac.getHeight();
   if (height == -1)
    height = size.height;
   if (ac.x + width > maxWidth)
    maxWidth = ac.x + width;
   if (ac.y + height > maxHeight)
    maxHeight = ac.y + height;
  }
  return new Dimension(maxWidth, maxHeight);
 }

 public Dimension minimumLayoutSize(Container parent) {
  int maxWidth = 0;
  int maxHeight = 0;
  for (java.util.Enumeration e = constraints.keys(); e.hasMoreElements();) {
   Component comp = (Component) e.nextElement();
   AbsoluteConstraints ac = (AbsoluteConstraints) constraints
     .get(comp);
   Dimension size = comp.getMinimumSize();
   int width = ac.getWidth();
   if (width == -1)
    width = size.width;
   int height = ac.getHeight();
   if (height == -1)
    height = size.height;
   if (ac.x + width > maxWidth)
    maxWidth = ac.x + width;
   if (ac.y + height > maxHeight)
    maxHeight = ac.y + height;
  }
  return new Dimension(maxWidth, maxHeight);
 }

 public void layoutContainer(Container parent) {
  for (Enumeration e = constraints.keys(); e.hasMoreElements();) {
   Component comp = (Component) e.nextElement();
   AbsoluteConstraints ac = (AbsoluteConstraints) constraints
     .get(comp);
   Dimension size = comp.getPreferredSize();
   int width = ac.getWidth();
   if (width == -1)
    width = size.width;
   int height = ac.getHeight();
   if (height == -1)
    height = size.height;
   comp.setBounds(ac.x, ac.y, width, height);
  }
 }

 public void addLayoutComponent(Component comp, Object constr) {
  if (!(constr instanceof AbsoluteConstraints))
   throw new IllegalArgumentException();
  constraints.put(comp, constr);
 }

 public Dimension maximumLayoutSize(Container target) {
  return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
 }

 public float getLayoutAlignmentX(Container target) {
  return 0;
 }

 public float getLayoutAlignmentY(Container target) {
  return 0;
 }

 public void invalidateLayout(Container target) {
 }
}

//==================================================


import java.awt.Dimension;
import java.awt.Point;

public class AbsoluteConstraints implements java.io.Serializable {
 static final long serialVersionUID = 5261460716622152494L;
 public int x;
 public int y;
 public int width = -1;
 public int height = -1;

 public AbsoluteConstraints(Point pos) {
  this(pos.x, pos.y);
 }

 public AbsoluteConstraints(int x, int y) {
  this.x = x;
  this.y = y;
 }

 public AbsoluteConstraints(Point pos, Dimension size) {
  this.x = pos.x;
  this.y = pos.y;
  if (size != null) {
   this.width = size.width;
   this.height = size.height;
  }
 }

 public AbsoluteConstraints(int x, int y, int width, int height) {
  this.x = x;
  this.y = y;
  this.width = width;
  this.height = height;
 }

 public int getX() {
  return x;
 }

 public int getY() {
  return y;
 }

 public int getWidth() {
  return width;
 }

 public int getHeight() {
  return height;
 }

 public String toString() {
  return super.toString() + " [x=" + x + ", y=" + y + ", width=" + width
    + ", height=" + height + "]";
 }
}

//====================================================================


import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.DateFormat;
import java.text.FieldPosition;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.plaf.BorderUIResource;

public final class DatePicker extends JPanel {

 private static final long serialVersionUID = 1L;

// private static final int startX = 10;
 private static final int startX =10;

 private static final int startY = 60;

 private static final Font smallFont = new Font("Dialog", Font.PLAIN, 10);

 private static final Font largeFont = new Font("Dialog", Font.PLAIN, 12);

 private static final Insets insets = new Insets(2, 2, 2, 2);

 private static final Color highlight = new Color(255, 255, 204);

 private static final Color white = new Color(255, 255, 255);

 private static final Color gray = new Color(204, 204, 204);

 private Component selectedDay = null;

 private GregorianCalendar selectedDate = null;

 private GregorianCalendar originalDate = null;

 private boolean hideOnSelect = true;

 private final JButton backButton = new JButton();

 private final JLabel monthAndYear = new JLabel();

 private final JButton forwardButton = new JButton();

 private final JLabel[] dayHeadings = new JLabel[] { new JLabel("Sun"),
   new JLabel("Mon"), new JLabel("Tus"), new JLabel("Wed"), new JLabel("Thu"),
   new JLabel("Fri"), new JLabel("Sat") };

 private final JLabel[][] daysInMonth = new JLabel[][] {
   { new JLabel(), new JLabel(), new JLabel(), new JLabel(),
     new JLabel(), new JLabel(), new JLabel() },
   { new JLabel(), new JLabel(), new JLabel(), new JLabel(),
     new JLabel(), new JLabel(), new JLabel() },
   { new JLabel(), new JLabel(), new JLabel(), new JLabel(),
     new JLabel(), new JLabel(), new JLabel() },
   { new JLabel(), new JLabel(), new JLabel(), new JLabel(),
     new JLabel(), new JLabel(), new JLabel() },
   { new JLabel(), new JLabel(), new JLabel(), new JLabel(),
     new JLabel(), new JLabel(), new JLabel() },
   { new JLabel(), new JLabel(), new JLabel(), new JLabel(),
     new JLabel(), new JLabel(), new JLabel() } };

 private final JButton todayButton = new JButton();

 private final JButton cancelButton = new JButton();

 public DatePicker() {
  super();
  selectedDate = getToday();
  init();
 }

 public DatePicker(final Date initialDate) {
  super();
  if (null == initialDate)
   selectedDate = getToday();
  else
   (selectedDate = new GregorianCalendar()).setTime(initialDate);
  originalDate = new GregorianCalendar(
    selectedDate.get(Calendar.YEAR),
    selectedDate.get(Calendar.MONTH),
    selectedDate.get(Calendar.DATE));
  init();
 }

 public boolean isHideOnSelect() {
  return hideOnSelect;
 }

 public void setHideOnSelect(final boolean hideOnSelect) {
  if (this.hideOnSelect != hideOnSelect) {
   this.hideOnSelect = hideOnSelect;
   initButtons(false);
  }
 }

 public Date getDate() {
  if (null != selectedDate)
   return selectedDate.getTime();
  return null;
 }

 private void init() {
  setLayout(new AbsoluteLayout());
//  this.setMinimumSize(new Dimension(161, 226));
  this.setMinimumSize(new Dimension(300, 226));
  this.setMaximumSize(getMinimumSize());
  this.setPreferredSize(getMinimumSize());
  this.setBorder(new BorderUIResource.EtchedBorderUIResource());

  backButton.setFont(smallFont);
  backButton.setText("<");
  backButton.setMargin(insets);
  backButton.setDefaultCapable(false);
  backButton.addActionListener(new ActionListener() {
   public void actionPerformed(final ActionEvent evt) {
    onBackClicked(evt);
   }
  });
  add(backButton, new AbsoluteConstraints(40, 10, 20, 20));

  monthAndYear.setFont(largeFont);
  monthAndYear.setHorizontalAlignment(JTextField.CENTER);
  monthAndYear.setText(formatDateText(selectedDate.getTime()));
  add(monthAndYear, new AbsoluteConstraints(50, 10, 200, 20));

  forwardButton.setFont(smallFont);
  forwardButton.setText(">");
  forwardButton.setMargin(insets);
  forwardButton.setDefaultCapable(false);
  forwardButton.addActionListener(new ActionListener() {
   public void actionPerformed(final ActionEvent evt) {
    onForwardClicked(evt);
   }
  });
//  add(forwardButton, new AbsoluteConstraints(130, 10, 20, 20));
  add(forwardButton, new AbsoluteConstraints(240, 10, 20, 20));

  int x = startX;
  for (int ii = 0; ii < dayHeadings.length; ii++) {
   dayHeadings[ii].setOpaque(true);
   dayHeadings[ii].setBackground(Color.LIGHT_GRAY);
   dayHeadings[ii].setForeground(Color.WHITE);
   dayHeadings[ii].setHorizontalAlignment(JLabel.CENTER);
//   add(dayHeadings[ii], new AbsoluteConstraints(x, 40, 21, 21));
   add(dayHeadings[ii], new AbsoluteConstraints(x, 40, 40, 21));
//   x += 20;
   x += 40;
  }

  x = startX;
  int y = startY;
  for (int ii = 0; ii < daysInMonth.length; ii++) {
   for (int jj = 0; jj < daysInMonth[ii].length; jj++) {
    daysInMonth[ii][jj].setOpaque(true);
    daysInMonth[ii][jj].setBackground(white);
    daysInMonth[ii][jj].setFont(smallFont);
    daysInMonth[ii][jj].setHorizontalAlignment(JLabel.CENTER);
    daysInMonth[ii][jj].setText("");
    daysInMonth[ii][jj].addMouseListener(new MouseAdapter() {
     public void mouseClicked(final MouseEvent evt) {
      onDayClicked(evt);
     }
    });
//    add(daysInMonth[ii][jj], new AbsoluteConstraints(x, y, 21, 21));
    add(daysInMonth[ii][jj], new AbsoluteConstraints(x, y, 40, 21));
//    x += 20;
    x += 40;
   }
   x = startX;
   y += 20;
  }

  initButtons(true);

  calculateCalendar();
 }

 private void initButtons(final boolean firstTime) {
  if (firstTime) {
   final Dimension buttonSize = new Dimension(68, 24);
   todayButton.setText("Today");
   todayButton.setMargin(insets);
   todayButton.setMaximumSize(buttonSize);
   todayButton.setMinimumSize(buttonSize);
   todayButton.setPreferredSize(buttonSize);
   todayButton.setDefaultCapable(true);
   todayButton.setSelected(true);
   todayButton.addActionListener(new ActionListener() {
    public void actionPerformed(final ActionEvent evt) {
     onToday(evt);
    }
   });

   cancelButton.setText("Cancel");
   cancelButton.setMargin(insets);
   cancelButton.setMaximumSize(buttonSize);
   cancelButton.setMinimumSize(buttonSize);
   cancelButton.setPreferredSize(buttonSize);
   cancelButton.addActionListener(new ActionListener() {
    public void actionPerformed(final ActionEvent evt) {
     onCancel(evt);
    }
   });
  } else {
   this.remove(todayButton);
   this.remove(cancelButton);
  }

  if (hideOnSelect) {
//   add(todayButton, new AbsoluteConstraints(25, 190, 52, -1));
   add(todayButton, new AbsoluteConstraints(57, 190, 52, -1));
//   add(cancelButton, new AbsoluteConstraints(87, 190, 52, -1));
   add(cancelButton, new AbsoluteConstraints(187, 190, 52, -1));
  } else {
   add(todayButton, new AbsoluteConstraints(55, 240, 52, -1));
  }
 }

 private void onToday(final java.awt.event.ActionEvent evt) {
  selectedDate = getToday();
  setVisible(!hideOnSelect);
  if (isVisible()) {
   monthAndYear.setText(formatDateText(selectedDate.getTime()));
   calculateCalendar();
  }
 }

 private void onCancel(final ActionEvent evt) {
  selectedDate = originalDate;
  setVisible(!hideOnSelect);
 }

 private void onForwardClicked(final java.awt.event.ActionEvent evt) {
  final int day = selectedDate.get(Calendar.DATE);
  selectedDate.set(Calendar.DATE, 1);
  selectedDate.add(Calendar.MONTH, 1);
  selectedDate.set(Calendar.DATE, Math.min(day,
    calculateDaysInMonth(selectedDate)));
  monthAndYear.setText(formatDateText(selectedDate.getTime()));
  calculateCalendar();
 }

 private void onBackClicked(final java.awt.event.ActionEvent evt) {
  final int day = selectedDate.get(Calendar.DATE);
  selectedDate.set(Calendar.DATE, 1);
  selectedDate.add(Calendar.MONTH, -1);
  selectedDate.set(Calendar.DATE, Math.min(day,
    calculateDaysInMonth(selectedDate)));
  monthAndYear.setText(formatDateText(selectedDate.getTime()));
  calculateCalendar();
 }

 private void onDayClicked(final java.awt.event.MouseEvent evt) {
  final javax.swing.JLabel fld = (javax.swing.JLabel) evt.getSource();
  if (!"".equals(fld.getText())) {
   fld.setBackground(highlight);
   selectedDay = fld;
   selectedDate.set(Calendar.DATE, Integer.parseInt(fld.getText()));
   setVisible(!hideOnSelect);
  }
 }

 private static GregorianCalendar getToday() {
  final GregorianCalendar gc = new GregorianCalendar();
  gc.set(Calendar.HOUR_OF_DAY, 0);
  gc.set(Calendar.MINUTE, 0);
  gc.set(Calendar.SECOND, 0);
  gc.set(Calendar.MILLISECOND, 0);
  return gc;
 }

 private void calculateCalendar() {
  if (null != selectedDay) {
   selectedDay.setBackground(white);
   selectedDay = null;
  }

  final GregorianCalendar c = new GregorianCalendar(selectedDate
    .get(Calendar.YEAR), selectedDate.get(Calendar.MONTH), 1);

  final int maxDay = calculateDaysInMonth(c);

  final int selectedDay = Math.min(maxDay, selectedDate
    .get(Calendar.DATE));

  int dow = c.get(Calendar.DAY_OF_WEEK);
  for (int dd = 0; dd < dow; dd++) {
   daysInMonth[0][dd].setText("");
  }

  int week;
  do {
   week = c.get(Calendar.WEEK_OF_MONTH);
   dow = c.get(Calendar.DAY_OF_WEEK);
   final JLabel fld = this.daysInMonth[week - 1][dow - 1];
   fld.setText(Integer.toString(c.get(Calendar.DATE)));
   if (selectedDay == c.get(Calendar.DATE)) {
    fld.setBackground(highlight);
    this.selectedDay = fld;
   }
   if (c.get(Calendar.DATE) >= maxDay)
    break;
   c.add(Calendar.DATE, 1);
  } while (c.get(Calendar.DATE) <= maxDay);

  week--;
  for (int ww = week; ww < daysInMonth.length; ww++) {
   for (int dd = dow; dd < daysInMonth[ww].length; dd++) {
    daysInMonth[ww][dd].setText("");
   }
   dow = 0;
  }

  c.set(Calendar.DATE, selectedDay);
  selectedDate = c;
 }

 private static int calculateDaysInMonth(final Calendar c) {
  int daysInMonth = 0;
  switch (c.get(Calendar.MONTH)) {
  case 0:
  case 2:
  case 4:
  case 6:
  case 7:
  case 9:
  case 11:
   daysInMonth = 31;
   break;
  case 3:
  case 5:
  case 8:
  case 10:
   daysInMonth = 30;
   break;
  case 1:
   final int year = c.get(Calendar.YEAR);
   daysInMonth = (0 == year % 1000) ? 29 : (0 == year % 100) ? 28
     : (0 == year % 4) ? 29 : 28;
   break;
  }
  return daysInMonth;
 }

 private static String formatDateText(final Date dt) {
  final DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);
  final StringBuffer mm = new StringBuffer();
  final StringBuffer yy = new StringBuffer();
  final FieldPosition mmfp = new FieldPosition(DateFormat.MONTH_FIELD);
  final FieldPosition yyfp = new FieldPosition(DateFormat.YEAR_FIELD);
  df.format(dt, mm, mmfp);
  df.format(dt, yy, yyfp);
  return
   (
    
    yy.toString().substring(yyfp.getBeginIndex(), yyfp.getEndIndex())
    + "-"
//    + " Year -"
    +mm.toString().substring(mmfp.getBeginIndex(),mmfp.getEndIndex())
//    + " Month" 
   );
 }

}

//========================================================

package my;

import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import sun.util.calendar.ZoneInfo;

public class MyCalen extends JFrame {

 private static final long serialVersionUID = 1L;
 private JPanel jContentPane = null;
 private JButton jButton = null;
 private DatePicker dp;
 private JTextField dateText = null;
 private JDialog dlg;
 private Point origin = new Point(); 

 /**
  * This method initializes jButton
  *
  * @return javax.swing.JButton
  */
 private JButton getJButton() {
  if (jButton == null) {
   jButton = new JButton();
   jButton.setBounds(new Rectangle(74, 68, 34, 10));
   jButton.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent e) {
     onButtonClick(e);
    }
   });
  }
  return jButton;
 }

 private static String dateToString(final Date dt) {
  if (null != dt) {
   String DATE_FORMAT_SHORT = "yyyy-MM-dd";
   SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_SHORT);
   TimeZone zone = new ZoneInfo("GMT", 0);
   sdf.setTimeZone(zone);
   return sdf.format(dt);
   //                return DateFormat.getDateInstance(DateFormat.LONG).format(dt);
  }
  return null;
 }

 final class Listener extends ComponentAdapter {

  public void componentHidden(final ComponentEvent evt) {
   final Date dt = ((DatePicker) evt.getSource()).getDate();
   if (null != dt)
    dateText.setText(dateToString(dt));
   dlg.dispose();
  }

 }

 private static Date stringToDate(final String s) {
  try {
   return DateFormat.getDateInstance(DateFormat.LONG).parse(s);
  } catch (ParseException e) {
   return null;
  }
 }

 

 private void onButtonClick(final java.awt.event.ActionEvent evt) {
  if ("".equals(dateText.getText()))
   dp = new DatePicker();
  else
   dp = new DatePicker(stringToDate(dateText.getText()));
  dp.addComponentListener(new Listener());

  final Point p = dateText.getLocationOnScreen();
  p.setLocation(p.getX(), p.getY() - 1 + dateText.getSize().getHeight());

  dlg = new JDialog(new JFrame(), true);

  dlg.addMouseListener(new MouseAdapter() {
   public void mousePressed(MouseEvent e) {
    origin.x = e.getX();
    origin.y = e.getY();
   }
  });
  dlg.addMouseMotionListener(new MouseMotionAdapter() {
   public void mouseDragged(MouseEvent e) {
    Point p = dlg.getLocation();
    dlg.setLocation(p.x + e.getX() - origin.x, p.y + e.getY()
      - origin.y);
   }
  });

  dlg.setLocation(p);
  dlg.setResizable(false);
  dlg.setUndecorated(true);
  dlg.getContentPane().add(dp);
  dlg.pack();
  dlg.setVisible(true);
 }

 /**
  * This method initializes date 
  *  
  * @return javax.swing.JTextField 
  */
 private JTextField getDate() {
  if (dateText == null) {
   dateText = new JTextField();
   dateText.setBounds(new Rectangle(68, 24, 115, 22));
  }
  return dateText;
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    MyCalen thisClass = new MyCalen();
    thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    thisClass.setVisible(true);
   }
  });
 }

 /**
  * This is the default constructor
  */
 public MyCalen() {
  super();
  initialize();
 }

 /**
  * This method initializes this
  *
  * @return void
  */
 private void initialize() {
  this.setSize(300, 200);
  this.setContentPane(getJContentPane());
  this.setTitle("JFrame");
 }

 /**
  * This method initializes jContentPane
  *
  * @return javax.swing.JPanel
  */
 private JPanel getJContentPane() {
  if (jContentPane == null) {
   jContentPane = new JPanel();
   jContentPane.setLayout(null);
   jContentPane.add(getJButton(), null);
   jContentPane.add(getDate(), null);
  }
  return jContentPane;
 }

}

图片实际效果

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Java Swing中提供了JDatePicker控件来创建日期选择器,但是它不支持时间选择器。如果需要创建时间选择器,可以使用JSpinner控件和SpinnerDateModel类来实现。 下面是一个简单的例子: ```java import java.awt.FlowLayout; import java.util.Calendar; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JSpinner; import javax.swing.SpinnerDateModel; public class TimePickerExample { public static void main(String[] args) { JFrame frame = new JFrame("Time Picker Example"); frame.setLayout(new FlowLayout()); frame.setSize(300, 100); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Create a SpinnerDateModel with current time as default value SpinnerDateModel model = new SpinnerDateModel(Calendar.getInstance().getTime(), null, null, Calendar.HOUR_OF_DAY); // Create a JSpinner with the SpinnerDateModel JSpinner spinner = new JSpinner(model); // Set the format of the displayed value JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "HH:mm:ss"); spinner.setEditor(editor); // Add the spinner to the frame frame.add(new JLabel("Select Time:")); frame.add(spinner); frame.setVisible(true); } } ``` 在这个例子中,我们使用了FlowLayout布局管理器来排列控件。我们创建了一个SpinnerDateModel对象,并将当前时间设置为默认值。然后,我们使用SpinnerDateModel对象创建了一个JSpinner对象。我们还使用JSpinner.DateEditor类设置了显示值的格式。最后,我们将JSpinner添加到框架中并使其可见。 这个例子创建的时间选择器只允许选择小时、分钟和秒。如果需要选择其他时间单位,需要调整SpinnerDateModel对象的构造函数中的参数。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值