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