- package bruce.lib.swing;
-
- import java.awt.GridBagConstraints;
- import java.awt.GridBagLayout;
- 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.awt.event.MouseListener;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.Locale;
-
- import javax.swing.BorderFactory;
- import javax.swing.Icon;
- import javax.swing.ImageIcon;
- import javax.swing.JButton;
- import javax.swing.JPanel;
- import javax.swing.JTextField;
-
- import bruce.lib.swing.JDatePickPane.PickDate;
-
- /**
- * @author Bruce (NaNashi)
- *
- */
- public class JDateField extends JPanel {
-
- private JButton btnPopup;
- private JTextField txtInput;
- private Calendar c;
-
- private String format;
- private String[] dayDisplayNames;
- private Locale locale;
- private Icon leftArrow;
- private Icon rightArrow;
- private boolean isCloseOnClick;
-
- public JDateField() {
- super(new GridBagLayout());
-
- this.locale = Locale.getDefault();
- this.format = JDatePickPane.DEFAULT_DATE_FORMAT;
-
- this.leftArrow = JDatePickPane.getImageIcon("/bruce/lib/swing/img/Arrow.blue.left.png", 20, 20);
- this.rightArrow = JDatePickPane.getImageIcon("/bruce/lib/swing/img/Arrow.blue.right.png", 20, 20);
-
- this.txtInput = new JTextField();
- this.txtInput.setEditable(false);
- this.add(this.txtInput, new GridBagConstraints(0, 0, 1, 1, 1, 0, 10, 2, new Insets(1, 1, 1, 1), 0, 0));
-
- try {
- btnPopup = new JButton(new ImageIcon(this.getClass().getResource("/bruce/lib/swing/img/calendar-date-icon.png")));
- btnPopup.setBorder(BorderFactory.createEmptyBorder());
- btnPopup.setBorderPainted(false);
- } catch (Exception e) {
- btnPopup = new JButton("P");
- }
- btnPopup.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- popup();
- }
- });
- this.add(btnPopup, new GridBagConstraints(1, 0, 1, 1, 0, 0, 10, 2, new Insets(1, 1, 1, 1), 0, 0));
- }
-
- public JDateField(int columns) {
- this();
- this.txtInput.setColumns(columns);
- }
-
- public JDateField(Calendar c) {
- this();
- this.setSelectedDateText(c);
- }
-
- public JDateField(Calendar c, int columns) {
- this(c);
- this.txtInput.setColumns(columns);
- }
-
- private void popup() {
- JDatePickDialog dialog = new JDatePickDialog(this.txtInput);
- dialog.setTodayFormat(this.format);
- dialog.setDayName(this.dayDisplayNames);
- dialog.setUILocale(this.locale);
- dialog.setLeftArrow(this.leftArrow);
- dialog.setRightArrow(this.rightArrow);
-
- dialog.setDateSelected(new PickDate() {
- @Override
- public void pick(Calendar c) {
- setSelectedDateText(c);
- }
- });
-
- try {
- dialog.view(txtInput.getText().trim());
- } catch (Exception ex) {
- dialog.view();
- }
- }
-
- public void setFormat(String format) {
- this.format = format;
- this.setSelectedDateText(this.c);
- }
-
- public String getFormat() {
- return this.format == null ? JDatePickPane.DEFAULT_DATE_FORMAT : this.format;
- }
-
- public String[] getDayDisplayNames() {
- return dayDisplayNames;
- }
-
- public void setDayDisplayNames(String[] dayDisplayNames) {
- this.dayDisplayNames = dayDisplayNames;
- }
-
- public Locale getUILocale() {
- return locale;
- }
-
- public void setUILocale(Locale locale) {
- this.locale = locale;
- }
-
- public Icon getLeftArrow() {
- return leftArrow;
- }
-
- public void setLeftArrow(Icon leftArrow) {
- this.leftArrow = leftArrow;
- }
-
- public Icon getRightArrow() {
- return rightArrow;
- }
-
- public void setRightArrow(Icon rightArrow) {
- this.rightArrow = rightArrow;
- }
-
- public void setCloseOnClick(boolean isCloseOnClick) {
- this.isCloseOnClick = isCloseOnClick;
- }
-
- public boolean isCloseOnClick() {
- return isCloseOnClick;
- }
-
- public int getColumns() {
- return this.txtInput.getColumns();
- }
-
- public void setColumns(int columns) {
- this.txtInput.setColumns(columns);
- }
-
- public void setButtonVisible(boolean b) {
- this.btnPopup.setVisible(b);
- if (b) {
- MouseListener[] ls = this.txtInput.getMouseListeners();
- for (MouseListener l : ls) {
- this.txtInput.removeMouseListener(l);
- }
- } else {
- this.txtInput.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- popup();
- }
- });
- }
- }
-
- public void setSelectedDateText(Date date) {
- Calendar c = Calendar.getInstance();
- c.setTime(date);
- this.setSelectedDateText(c);
- }
-
- public void setSelectedDateText(Calendar c) {
- this.c = c;
- if (this.format == null) {
- this.txtInput.setText(String.format("%tF", c));
- } else {
- try {
- SimpleDateFormat f = new SimpleDateFormat(this.format);
- this.txtInput.setText(f.format(c.getTime()));
- } catch (Exception ex) {
- this.txtInput.setText(String.format("%tF", c));
- }
- }
- }
-
- public Calendar getSelectedCalender() {
- return this.c == null ? Calendar.getInstance() : this.c;
- }
-
- }
- package bruce.lib.swing;
-
- import java.awt.Component;
- import java.awt.Dimension;
- import java.awt.Point;
- import java.awt.Toolkit;
- import java.awt.event.WindowEvent;
- import java.awt.event.WindowFocusListener;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Locale;
-
- import javax.swing.BorderFactory;
- import javax.swing.Icon;
- import javax.swing.JDialog;
-
- import bruce.lib.swing.JDatePickPane.PickDate;
-
- /**
- * @author Bruce (NaNashi)
- *
- */
- public class JDatePickDialog extends JDialog {
-
- private boolean isCloseOnClick;
-
- public JDatePickDialog() {
- this.init();
-
- Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
- this.setLocation(new Point((size.width - this.getWidth()) / 2, (size.height - this.getHeight()) / 2));
- }
-
- public JDatePickDialog(Component c) {
- this.setUndecorated(true);
- this.init();
-
- this.getContent().setBorder(BorderFactory.createEtchedBorder());
-
- this.addWindowFocusListener(new WindowFocusListener() {
- @Override
- public void windowLostFocus(WindowEvent e) {
- setVisible(false);
- dispose();
- }
-
- @Override
- public void windowGainedFocus(WindowEvent e) {
- // TODO Auto-generated method stub
-
- }
- });
-
- if (c != null) {
- Point p = c.getLocationOnScreen();
- this.setLocation(new Point(p.x, p.y + c.getHeight()));
- } else {
- Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
- this.setLocation((int) (dim.getWidth() - this.getWidth()) / 2, (int) (dim.getHeight() - this.getHeight()) / 2);
- }
- }
-
- private void init() {
- this.isCloseOnClick = true;
-
- this.setContentPane(new JDatePickPane());
-
- this.setDateSelected(new PickDate() {
- @Override
- public void pick(Calendar c) {
- // 預設值
- }
- });
-
- this.pack();
- }
-
- private JDatePickPane getContent() {
- return (JDatePickPane) this.getContentPane();
- }
-
- public void setCloseOnClick(boolean isCloseOnClick) {
- this.isCloseOnClick = isCloseOnClick;
- }
-
- public boolean isCloseOnClick() {
- return isCloseOnClick;
- }
-
- // ========== panel method ================
- /**
- * 選取日期的觸發動作
- *
- * @param pick
- */
- public void setDateSelected(final PickDate pick) {
- PickDate pd = new PickDate() {
- @Override
- public void pick(Calendar c) {
- pick.pick(c);
- if (isCloseOnClick) {
- setVisible(false);
- dispose();
- }
- }
- };
- this.getContent().setDateSelected(pd);
- }
-
- /**
- * 目前選取日期
- *
- * @return
- */
- public Calendar getSelectedCalendar() {
- return this.getContent().getSelectedCalendar();
- }
-
- /**
- * 設定選取的日期
- *
- * @param c
- */
- public void setSelectedCalendar(Calendar c) {
- this.getContent().setSelectedCalendar(c);
- }
-
- /**
- * 取得星期的顯示名稱
- *
- * @return
- */
- public String[] getDayNames() {
- return this.getContent().getDayNames();
- }
-
- /**
- * 設定星期的顯示名稱
- *
- * @param names
- */
- public void setDayName(String[] names) {
- this.getContent().setDayName(names);
- }
-
- /**
- * 設定今天的顯示格式
- *
- * @param format
- */
- public void setTodayFormat(String format) {
- this.getContent().setTodayFormat(format);
- }
-
- public String getTodayFormat() {
- return this.getContent().getTodayFormat();
- }
-
- public void setUILocale(Locale l) {
- this.getContent().setUILocale(l);
- }
-
- public Locale getUILocale() {
- return this.getContent().getUILocale();
- }
-
- public void setLeftArrow(Icon icon) {
- this.getContent().setLeftArrow(icon);
- }
-
- public void setRightArrow(Icon icon) {
- this.getContent().setRightArrow(icon);
- }
-
- /**
- * 顯示選擇的日期
- *
- * @param c
- */
- public void view(Calendar c) {
- this.getContent().view(c);
- this.setVisible(true);
- }
-
- public void view(String date) throws ParseException {
- SimpleDateFormat f = new SimpleDateFormat(this.getContent().getTodayFormat());
- Calendar c = Calendar.getInstance();
- c.setTime(f.parse(date));
- this.getContent().setSelectedCalendar(c);
- this.view(c);
- }
-
- /**
- * 顯示今天的日期
- */
- public void view() {
- this.getContent().view();
- this.setVisible(true);
- }
- }
- package bruce.lib.swing;
-
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Container;
- import java.awt.Dimension;
- import java.awt.FlowLayout;
- import java.awt.Font;
- import java.awt.GridBagConstraints;
- import java.awt.GridBagLayout;
- import java.awt.GridLayout;
- import java.awt.Insets;
- import java.awt.Window;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.awt.geom.AffineTransform;
- import java.awt.image.AffineTransformOp;
- import java.awt.image.BufferedImage;
- import java.text.SimpleDateFormat;
- import java.util.Arrays;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.Locale;
-
- import javax.imageio.ImageIO;
- import javax.swing.BorderFactory;
- import javax.swing.Icon;
- import javax.swing.ImageIcon;
- import javax.swing.JButton;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.SwingConstants;
-
- /**
- * @author Bruce (NaNashi)
- *
- */
- public class JDatePickPane extends JPanel {
-
- public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
-
- public static Icon getImageIcon(String location, double width, double height) {
- try {
- BufferedImage icon = ImageIO.read(String.class.getResource(location));
- // resize image
- AffineTransform transform = AffineTransform.getScaleInstance(width / icon.getWidth(), height / icon.getHeight());
- AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
- return new ImageIcon(op.filter(icon, null));
- } catch (Exception e) {
- return null;
- }
- }
-
- public interface PickDate {
- void pick(Calendar c);
- }
-
- class DayCell extends JButton {
- private long stamp;
-
- DayCell(Calendar c, Calendar currentMonth, Calendar selected) {
- super(String.valueOf(c.get(Calendar.DATE)));
-
- stopWatch("Day Cell");
-
- this.stamp = c.getTimeInMillis();
- Calendar now = Calendar.getInstance();
- if (c.get(Calendar.YEAR) == now.get(Calendar.YEAR) && c.get(Calendar.MONTH) == now.get(Calendar.MONTH) && c.get(Calendar.DATE) == now.get(Calendar.DATE)) {
- this.setBorder(BorderFactory.createLineBorder(Color.BLUE));
- this.setForeground(Color.BLUE);
- this.setFont(this.getFont().deriveFont(Font.BOLD, this.getFont().getSize()));
- } else if (c.get(Calendar.YEAR) != currentMonth.get(Calendar.YEAR) || c.get(Calendar.MONTH) != currentMonth.get(Calendar.MONTH)) {
- this.setForeground(Color.GRAY);
- this.setBorder(BorderFactory.createEtchedBorder());
- } else {
- this.setBorder(BorderFactory.createEtchedBorder());
- }
- if (c.get(Calendar.YEAR) == selected.get(Calendar.YEAR) && c.get(Calendar.MONTH) == selected.get(Calendar.MONTH) && c.get(Calendar.DATE) == selected.get(Calendar.DATE)) {
- this.setBorder(BorderFactory.createLineBorder(Color.RED));
- this.setForeground(Color.RED);
- this.setFont(this.getFont().deriveFont(Font.BOLD, this.getFont().getSize()));
- }
-
- this.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseExited(MouseEvent e) {
- setBackground(null);
- }
-
- @Override
- public void mouseEntered(MouseEvent e) {
- setBackground(Color.white);
- }
- });
- this.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- JDatePickPane pick = (JDatePickPane) getParent().getParent();
- pick.selectedDate.setTimeInMillis(stamp);
-
- pick.view(pick.selectedDate);
-
- if (pick.pickAtion != null) {
- pick.pickAtion.pick(pick.selectedDate);
- }
- }
- });
- }
- }
-
- class MonthCell extends JButton {
- private long stamp;
-
- public MonthCell(Calendar c, Calendar selected) {
- super(c.getDisplayName(Calendar.MONTH, Calendar.SHORT, loc));
-
- stopWatch("Month Cell");
-
- this.stamp = c.getTimeInMillis();
- this.setBorder(BorderFactory.createEtchedBorder());
- this.setPreferredSize(new Dimension(50, 50));
-
- Calendar now = Calendar.getInstance();
- if (c.get(Calendar.YEAR) == now.get(Calendar.YEAR) && c.get(Calendar.MONTH) == now.get(Calendar.MONTH)) {
- this.setBorder(BorderFactory.createLineBorder(Color.BLUE));
- this.setForeground(Color.BLUE);
- this.setFont(this.getFont().deriveFont(Font.BOLD, this.getFont().getSize()));
-
- } else {
- this.setBorder(BorderFactory.createEtchedBorder());
- }
- if (c.get(Calendar.YEAR) == selected.get(Calendar.YEAR) && c.get(Calendar.MONTH) == selected.get(Calendar.MONTH)) {
- this.setBorder(BorderFactory.createLineBorder(Color.RED));
- this.setForeground(Color.RED);
- this.setFont(this.getFont().deriveFont(Font.BOLD, this.getFont().getSize()));
- }
-
- this.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseExited(MouseEvent e) {
- setBackground(null);
- }
-
- @Override
- public void mouseEntered(MouseEvent e) {
- setBackground(Color.white);
- }
- });
- this.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- Calendar c = Calendar.getInstance();
- c.setTimeInMillis(stamp);
-
- JDatePickPane pick = (JDatePickPane) getParent().getParent();
- pick.view(c);
- }
- });
- }
- }
-
- class YearCell extends JButton {
- private long stamp;
-
- public YearCell(Calendar c, Calendar selected) {
- super(String.valueOf(c.get(Calendar.YEAR)));
-
- stopWatch("Year Cell");
-
- this.stamp = c.getTimeInMillis();
- this.setBorder(BorderFactory.createEtchedBorder());
- this.setPreferredSize(new Dimension(50, 50));
-
- Calendar now = Calendar.getInstance();
- if (c.get(Calendar.YEAR) == now.get(Calendar.YEAR)) {
- this.setBorder(BorderFactory.createLineBorder(Color.BLUE));
- this.setForeground(Color.BLUE);
- this.setFont(this.getFont().deriveFont(Font.BOLD, this.getFont().getSize()));
-
- } else {
- this.setBorder(BorderFactory.createEtchedBorder());
- }
- if (c.get(Calendar.YEAR) == selected.get(Calendar.YEAR)) {
- this.setBorder(BorderFactory.createLineBorder(Color.RED));
- this.setForeground(Color.RED);
- this.setFont(this.getFont().deriveFont(Font.BOLD, this.getFont().getSize()));
- }
-
- this.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseExited(MouseEvent e) {
- setBackground(null);
- }
-
- @Override
- public void mouseEntered(MouseEvent e) {
- setBackground(Color.white);
- }
- });
- this.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- Calendar c = Calendar.getInstance();
- c.setTimeInMillis(stamp);
-
- JDatePickPane pick = (JDatePickPane) getParent().getParent();
- pick.viewMonth(c);
- }
- });
- }
- }
-
- private String format;
-
- private Calendar selectedDate;
-
- private PickDate pickAtion;
-
- private String[] dayDisplayNames;
-
- private Locale loc;
-
- private Icon leftArrow;
- private Icon rightArrow;
-
- public JDatePickPane() {
- this.selectedDate = Calendar.getInstance();
- this.setLayout(new BorderLayout());
- this.selectedDate = Calendar.getInstance();
- this.loc = Locale.getDefault();
- this.format = JDatePickPane.DEFAULT_DATE_FORMAT;
-
- this.leftArrow = getImageIcon("/bruce/lib/swing/img/Arrow.blue.left.png", 20, 20);
- this.rightArrow = getImageIcon("/bruce/lib/swing/img/Arrow.blue.right.png", 20, 20);
-
- this.view();
- }
-
- private void putToday() {
- stopWatch("Today Bar");
-
- JPanel panel = new JPanel(new FlowLayout());
- String today = String.format("%tF", Calendar.getInstance());
- try {
- if (this.format != null) {
- SimpleDateFormat f = new SimpleDateFormat(this.format);
- today = f.format(new Date());
- }
- } catch (Exception e) {
- }
- final JLabel lbToday = new JLabel(today);
- lbToday.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseEntered(MouseEvent e) {
- lbToday.setFont(lbToday.getFont().deriveFont(Font.BOLD, lbToday.getFont().getSize()));
- }
-
- @Override
- public void mouseExited(MouseEvent e) {
- lbToday.setFont(lbToday.getFont().deriveFont(Font.PLAIN, lbToday.getFont().getSize()));
- }
-
- @Override
- public void mouseClicked(MouseEvent e) {
- selectedDate = Calendar.getInstance();
- view(selectedDate);
-
- if (pickAtion != null) {
- pickAtion.pick(selectedDate);
- }
- }
- });
- panel.add(lbToday);
- this.add(panel, BorderLayout.SOUTH);
- }
-
- private void setYearBarText(JLabel label, Calendar c) {
- label.setText(String.format("%d - %d", //
- c.get(Calendar.YEAR) - c.get(Calendar.YEAR) % 12 + 1,//
- c.get(Calendar.YEAR) - c.get(Calendar.YEAR) % 12 + 12));
- }
-
- private void putYearBar(final Calendar c) {
- stopWatch("Year Bar");
-
- JPanel panel = new JPanel(new BorderLayout());
-
- final JLabel lbPeriod = new JLabel();
- lbPeriod.setHorizontalAlignment(SwingConstants.CENTER);
- this.setYearBarText(lbPeriod, c);
- panel.add(lbPeriod, BorderLayout.CENTER);
-
- JButton btnLeft = this.leftArrow == null ? new JButton("<") : new JButton(this.leftArrow);
- btnLeft.setBorderPainted(false);
- btnLeft.setBorder(BorderFactory.createEmptyBorder());
- btnLeft.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- Calendar s = (Calendar) c.clone();
- s.add(Calendar.YEAR, -12);
-
- setYearBarText(lbPeriod, c);
- viewYear(s);
- }
- });
- panel.add(btnLeft, BorderLayout.WEST);
-
- JButton btnRight = this.rightArrow == null ? new JButton(">") : new JButton(this.rightArrow);
- btnRight.setBorderPainted(false);
- btnRight.setBorder(BorderFactory.createEmptyBorder());
- btnRight.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- Calendar s = (Calendar) c.clone();
- s.add(Calendar.YEAR, 12);
-
- setYearBarText(lbPeriod, c);
- viewYear(s);
- }
- });
- panel.add(btnRight, BorderLayout.EAST);
-
- this.add(panel, BorderLayout.NORTH);
- }
-
- private void setMonthBarText(JButton label, Calendar c) {
- label.setText(String.valueOf(c.get(Calendar.YEAR)));
- }
-
- private void putMonthBar(final Calendar c) {
- stopWatch("Month Bar");
-
- JPanel panel = new JPanel(new BorderLayout());
-
- final JButton btnPeriod = new JButton();
- btnPeriod.setHorizontalAlignment(SwingConstants.CENTER);
- btnPeriod.setBorder(BorderFactory.createEmptyBorder());
- btnPeriod.setBorderPainted(false);
-
- this.setMonthBarText(btnPeriod, c);
- btnPeriod.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- viewYear(c);
- }
- });
- btnPeriod.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseEntered(MouseEvent e) {
- btnPeriod.setFont(btnPeriod.getFont().deriveFont(Font.BOLD, btnPeriod.getFont().getSize()));
- }
-
- @Override
- public void mouseExited(MouseEvent e) {
- btnPeriod.setFont(btnPeriod.getFont().deriveFont(Font.PLAIN, btnPeriod.getFont().getSize()));
- }
- });
- panel.add(btnPeriod, BorderLayout.CENTER);
-
- JButton btnLeft = this.leftArrow == null ? new JButton("<") : new JButton(this.leftArrow);
- btnLeft.setBorderPainted(false);
- btnLeft.setBorder(BorderFactory.createEmptyBorder());
- btnLeft.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- Calendar s = (Calendar) c.clone();
- s.add(Calendar.YEAR, -1);
-
- setMonthBarText(btnPeriod, c);
- viewMonth(s);
- }
- });
- panel.add(btnLeft, BorderLayout.WEST);
-
- JButton btnRight = this.rightArrow == null ? new JButton(">") : new JButton(this.rightArrow);
- btnRight.setBorderPainted(false);
- btnRight.setBorder(BorderFactory.createEmptyBorder());
- btnRight.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- Calendar s = (Calendar) c.clone();
- s.add(Calendar.YEAR, 1);
- setMonthBarText(btnPeriod, c);
-
- viewMonth(s);
- }
- });
- panel.add(btnRight, BorderLayout.EAST);
-
- this.add(panel, BorderLayout.NORTH);
- }
-
- private void setDateBarText(JButton label, Calendar c) {
- label.setText(String.format("%s, %d", //
- c.getDisplayName(Calendar.MONTH, Calendar.LONG, loc),//
- c.get(Calendar.YEAR)));
- }
-
- private void putDateBar(final Calendar c) {
- stopWatch("Date Bar");
-
- JPanel panel = new JPanel(new BorderLayout());
-
- final JButton btnPeriod = new JButton();
- btnPeriod.setHorizontalAlignment(SwingConstants.CENTER);
- btnPeriod.setBorder(BorderFactory.createEmptyBorder());
- btnPeriod.setBorderPainted(false);
-
- this.setDateBarText(btnPeriod, c);
- btnPeriod.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- viewMonth(c);
- }
- });
- btnPeriod.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseEntered(MouseEvent e) {
- btnPeriod.setFont(btnPeriod.getFont().deriveFont(Font.BOLD, btnPeriod.getFont().getSize()));
- }
-
- @Override
- public void mouseExited(MouseEvent e) {
- btnPeriod.setFont(btnPeriod.getFont().deriveFont(Font.PLAIN, btnPeriod.getFont().getSize()));
- }
- });
- panel.add(btnPeriod, BorderLayout.CENTER);
-
- JButton btnLeft = this.leftArrow == null ? new JButton("<") : new JButton(this.leftArrow);
- btnLeft.setBorderPainted(false);
- btnLeft.setBorder(BorderFactory.createEmptyBorder());
- btnLeft.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- Calendar s = (Calendar) c.clone();
- s.add(Calendar.MONTH, -1);
-
- view(s);
-
- setDateBarText(btnPeriod, c);
- }
- });
- panel.add(btnLeft, BorderLayout.WEST);
-
- JButton btnRight = this.rightArrow == null ? new JButton(">") : new JButton(this.rightArrow);
- btnRight.setBorderPainted(false);
- btnRight.setBorder(BorderFactory.createEmptyBorder());
- btnRight.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- Calendar s = (Calendar) c.clone();
- s.add(Calendar.MONTH, 1);
-
- view(s);
-
- setDateBarText(btnPeriod, c);
- }
- });
- panel.add(btnRight, BorderLayout.EAST);
-
- this.add(panel, BorderLayout.NORTH);
- }
-
- private void putYearContent(Calendar c) {
- stopWatch("Year Bar");
-
- JPanel panel = new JPanel(new GridLayout(3, 4));
-
- Calendar s = (Calendar) c.clone();
- s.set(Calendar.YEAR, s.get(Calendar.YEAR) - s.get(Calendar.YEAR) % 12);
- for (int i = 0; i < 12; i++) {
- s.add(Calendar.YEAR, 1);
- panel.add(new YearCell(s, this.selectedDate));
- }
-
- this.add(panel, BorderLayout.CENTER);
- }
-
- private void putMonthContent(Calendar c) {
- stopWatch("Month Bar");
-
- JPanel panel = new JPanel(new GridLayout(3, 4));
-
- Calendar s = (Calendar) c.clone();
- for (int i = 0; i < 12; i++) {
- s.set(Calendar.MONTH, i);
- panel.add(new MonthCell(s, this.selectedDate));
- }
-
- this.add(panel, BorderLayout.CENTER);
- }
-
- private void putDateContent(Calendar c) {
- stopWatch("Date Content");
-
- JPanel panel = new JPanel(new GridBagLayout());
- Insets insets = new Insets(1, 1, 1, 1);
- this.putHeaders(panel, insets);
-
- int rows = this.getMonthRowsCount(c);
- Calendar d = this.getFirstDate(c);
-
- for (int y = 1; y < rows + 1; y++) {
- for (int x = 1; x < 8; x++) {
- panel.add(new DayCell(d, c, this.selectedDate), new GridBagConstraints(x, y, 1, 1, 0, 0, 10, 1, insets, 10, 0));
- d.add(Calendar.DATE, 1);
- }
- }
-
- this.add(panel, BorderLayout.CENTER);
- }
-
- private void viewYear(Calendar c) {
- this.clear();
- this.putYearContent(c);
- this.putYearBar(c);
- this.pack();
- }
-
- private void viewMonth(Calendar c) {
- this.clear();
- this.putMonthContent(c);
- this.putMonthBar(c);
-
- this.pack();
- }
-
- /**
- * 處理星期顯示格
- *
- * @param panel
- * @param insets
- */
- private void putHeaders(JPanel panel, Insets insets) {
- if (this.dayDisplayNames == null) {
- Calendar s = Calendar.getInstance();
- s.set(Calendar.DAY_OF_WEEK, 1);
-
- Color c = null;
- for (int i = 0; i < 7; i++) {
- // 星期表示法
- String h = s.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, loc);
- s.add(Calendar.DATE, 1);
- if (loc == Locale.TAIWAN || loc == Locale.CHINA || loc == Locale.CHINESE || loc == Locale.SIMPLIFIED_CHINESE || loc == Locale.TRADITIONAL_CHINESE) {
- h = h.substring(h.length() - 1);
- } else if (loc == Locale.JAPAN || loc == Locale.JAPANESE) {
- h = h.substring(0, 1);
- } else {
- h = h.substring(0, 3);
- }
-
- switch (i) {
- case 0:
- c = Color.red;
- break;
- case 6:
- c = Color.BLUE;
- break;
- default:
- c = Color.BLACK;
- break;
- }
- panel.add(this.createHeader(h, c), new GridBagConstraints(i + 1, 0, 1, 1, 0, 0, 10, 1, insets, 10, 0));
- }
- } else {
- String[] headers = Arrays.copyOf(this.dayDisplayNames, 7);
- Color c = null;
- for (int i = 0; i < 7; i++) {
- switch (i) {
- case 0:
- c = Color.red;
- break;
- case 6:
- c = Color.BLUE;
- break;
- default:
- c = Color.BLACK;
- break;
- }
- panel.add(this.createHeader(headers[i], c), new GridBagConstraints(i + 1, 0, 1, 1, 0, 0, 10, 1, insets, 10, 0));
- }
- }
- }
-
- /**
- * 星期
- *
- * @param text
- * @param fontColor
- * @return
- */
- private JLabel createHeader(String text, Color fontColor) {
- JLabel l = new JLabel(text, SwingConstants.CENTER);
- l.setBorder(BorderFactory.createEtchedBorder());
- l.setOpaque(true);
- l.setBackground(Color.WHITE);
- l.setForeground(fontColor);
- return l;
- }
-
- /**
- * 計算月份的列數
- *
- * @param c
- * @return
- */
- private int getMonthRowsCount(Calendar c) {
- Calendar s = (Calendar) c.clone();
- s.set(Calendar.DATE, 1);
- return (int) Math.ceil((s.get(Calendar.DAY_OF_WEEK) + s.getActualMaximum(Calendar.DAY_OF_MONTH) - 1) / 7.0);
- }
-
- /**
- * 計算顯示的第一個日期
- *
- * @param c
- * @return
- */
- private Calendar getFirstDate(Calendar c) {
- Calendar s = (Calendar) c.clone();
- s.set(Calendar.DATE, 1);
- s.add(Calendar.DATE, -1 * (s.get(Calendar.DAY_OF_WEEK) - 1));
- return s;
- }
-
- /**
- * 清除
- */
- private void clear() {
- stopWatch("Clear");
-
- for (int i = this.getComponentCount() - 1; i > -1; i--) {
- this.remove(i);
- }
-
- this.putToday();
- System.gc();
- }
-
- /**
- * 重整大小
- */
- private void pack() {
- stopWatch("Pack");
-
- this.revalidate();
- // resize
- Container cc = this.getParent();
- while (cc != null) {
- if (cc instanceof Window) {
- ((Window) cc).pack();
- break;
- }
- cc = cc.getParent();
- }
- }
-
- /**
- * 測試時間
- *
- * @param what
- */
- private void stopWatch(String what) {
- // test time execute
- // System.out.printf("%2$s : %1$tY/%1$tm/%1$td %1$tH:%1$tM:%1$tS %1$tL%n",
- // new Date(), what);
- }
-
- /**
- * 選取日期的觸發動作
- *
- * @param pick
- */
- public void setDateSelected(PickDate pick) {
- this.pickAtion = pick;
- }
-
- /**
- * 目前選取日期
- *
- * @return
- */
- public Calendar getSelectedCalendar() {
- return (Calendar) this.selectedDate.clone();
- }
-
- /**
- * 設定選取的日期
- *
- * @param c
- */
- public void setSelectedCalendar(Calendar c) {
- this.selectedDate = c;
- }
-
- /**
- * 取得星期的顯示名稱
- *
- * @return
- */
- public String[] getDayNames() {
- return this.dayDisplayNames;
- }
-
- /**
- * 設定星期的顯示名稱
- *
- * @param names
- */
- public void setDayName(String[] names) {
- this.dayDisplayNames = names;
- this.view(this.selectedDate);
- }
-
- /**
- * 設定今天的顯示格式
- *
- * @param format
- */
- public void setTodayFormat(String format) {
- this.format = format;
- this.putToday();
- }
-
- public String getTodayFormat() {
- return this.format;
- }
-
- public void setUILocale(Locale l) {
- this.loc = l;
- this.view(this.selectedDate);
- }
-
- public Locale getUILocale() {
- return this.loc;
- }
-
- public void setLeftArrow(Icon icon) {
- this.leftArrow = icon;
- this.view(this.selectedDate);
- }
-
- public void setRightArrow(Icon icon) {
- this.rightArrow = icon;
- this.view(this.selectedDate);
- }
-
- /**
- * 顯示選擇的日期
- *
- * @param c
- */
- public void view(Calendar c) {
- // claer
- this.clear();
-
- this.putDateBar(c);
- this.putDateContent(c);
-
- this.pack();
- }
-
- /**
- * 顯示今天的日期
- */
- public void view() {
- this.view(Calendar.getInstance());
- }
- }