TimeChooser
来源:互联网 发布:阿里巴巴标题优化技巧 编辑:程序博客网 时间:2024/05/20 09:47
/** * * Copyright: Ares. All Rights Reserved. Company: Insigma HT * * @author Ares <a href="mailto:icerainsoft@hotmail.com>send email</a> * @date 2013-11-17 16:53 * * Revision History * * Date Programmer Notes --------- --------------------- * -------------------------------------------- 2013-11-17 Ares initial * * 1. you can change date format by parameter. 2. you can change week label content by * showTEXT. 3. you can change dayOfWeek order by defaultStartDAY. */package ref;import java.awt.BasicStroke;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Component;import java.awt.Cursor;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.GridLayout;import java.awt.Point;import java.awt.Polygon;import java.awt.Stroke;import java.awt.Toolkit;import java.awt.event.FocusEvent;import java.awt.event.FocusListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.List;import javax.swing.BorderFactory;import javax.swing.JComponent;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.PopupFactory;import javax.swing.SwingUtilities;import javax.swing.event.AncestorEvent;import javax.swing.event.AncestorListener;/** * @author Ares * @Describe(Date Chooser class) */public class Chooser extends JPanel{ private static final long serialVersionUID = -5384012731547358720L; private Calendar calendar; private Calendar now = Calendar.getInstance(); private JPanel calendarPanel; private java.awt.Font font = new java.awt.Font( "Times", java.awt.Font.PLAIN, 12 ); private java.text.SimpleDateFormat sdf; private final LabelManager lm = new LabelManager(); private javax.swing.Popup pop; private TitlePanel titlePanel; private BodyPanel bodyPanel; private FooterPanel footerPanel; private JComponent showDate; private boolean isShow = false; private static final String DEFAULTFORMAT = "yyyy-MM-dd"; private static final String[] showTEXT = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; private static WeekLabel[] weekLabels = new WeekLabel[7]; private static int defaultStartDAY = 0;//0 is from Sun, 1 is from Mon, 2 is from Tue private Chooser(java.util.Date date, String format, int startDAY) { if( startDAY > -1 && startDAY < 7 ) defaultStartDAY = startDAY; int dayIndex = defaultStartDAY; for( int i = 0; i < 7; i++ ) { if( dayIndex > 6 ) dayIndex = 0; weekLabels[i] = new WeekLabel( dayIndex, showTEXT[dayIndex] ); dayIndex++; } sdf = new java.text.SimpleDateFormat( format ); calendar = Calendar.getInstance(); calendar.setTime( date ); initCalendarPanel(); } public static Chooser getInstance( java.util.Date date, String format ) { return new Chooser( date, format, defaultStartDAY ); } public static Chooser getInstance( java.util.Date date ) { return getInstance( date, DEFAULTFORMAT ); } public static Chooser getInstance( String format ) { return getInstance( new java.util.Date(), format ); } public static Chooser getInstance() { return getInstance( new java.util.Date(), DEFAULTFORMAT ); } private void initCalendarPanel() { calendarPanel = new JPanel( new java.awt.BorderLayout() ); calendarPanel.setBorder( javax.swing.BorderFactory.createLineBorder( new java.awt.Color( 0xAA, 0xAA, 0xAA ) ) ); calendarPanel.add( titlePanel = new TitlePanel(), java.awt.BorderLayout.NORTH ); calendarPanel.add( bodyPanel = new BodyPanel(), java.awt.BorderLayout.CENTER ); calendarPanel.add( footerPanel = new FooterPanel(), java.awt.BorderLayout.SOUTH ); this.addAncestorListener( new AncestorListener() { public void ancestorAdded( AncestorEvent event ) { } public void ancestorRemoved( AncestorEvent event ) { hidePanel(); } //hide pop when move component. public void ancestorMoved( AncestorEvent event ) { hidePanel(); } } ); } public void register( final JComponent showComponent ) { this.showDate = showComponent; showComponent.setRequestFocusEnabled( true ); showComponent.addMouseListener( new MouseAdapter() { public void mousePressed( MouseEvent me ) { showComponent.requestFocusInWindow(); } } ); this.add( showComponent, BorderLayout.CENTER ); this.setPreferredSize( new Dimension( 90, 25 ) ); this.setBorder( BorderFactory.createLineBorder( Color.GRAY ) ); showComponent.addMouseListener( new MouseAdapter() { public void mouseEntered( MouseEvent me ) { if( showComponent.isEnabled() ) { showComponent.setCursor( new Cursor( Cursor.HAND_CURSOR ) ); } } public void mouseExited( MouseEvent me ) { if( showComponent.isEnabled() ) { showComponent.setCursor( new Cursor( Cursor.DEFAULT_CURSOR ) ); showComponent.setForeground( Color.BLACK ); } } public void mousePressed( MouseEvent me ) { if( showComponent.isEnabled() ) { showComponent.setForeground( Color.BLUE ); if( isShow ) { hidePanel(); } else { showPanel( showComponent ); } } } public void mouseReleased( MouseEvent me ) { if( showComponent.isEnabled() ) { showComponent.setForeground( Color.BLACK ); } } } ); showComponent.addFocusListener( new FocusListener() { public void focusLost( FocusEvent e ) { hidePanel(); } public void focusGained( FocusEvent e ) { } } ); } //hide the main panel. private void hidePanel() { if( pop != null ) { isShow = false; pop.hide(); pop = null; } } //show the main panel. private void showPanel( Component owner ) { if( pop != null ) pop.hide(); Point show = new Point( 0, showDate.getHeight() ); SwingUtilities.convertPointToScreen( show, showDate ); Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); int x = show.x; int y = show.y; if( x < 0 ) x = 0; if( x > size.width - 212 ) x = size.width - 212; if( y > size.height - 167 ) y -= 165; pop = PopupFactory.getSharedInstance().getPopup( owner, calendarPanel, x, y ); pop.show(); isShow = true; } // change text or label's content. private void commit() { if( showDate instanceof JTextField ) { ( (JTextField) showDate ).setText( sdf.format( calendar.getTime() ) ); } else if( showDate instanceof JLabel ) { ( (JLabel) showDate ).setText( sdf.format( calendar.getTime() ) ); } hidePanel(); } // control panel private class TitlePanel extends JPanel { private static final long serialVersionUID = -2865282186037420798L; private JLabel preYear, preMonth, center, nextMonth, nextYear, centercontainer; public TitlePanel() { super( new java.awt.BorderLayout() ); this.setBackground( new java.awt.Color( 190, 200, 200 ) ); initTitlePanel(); } private void initTitlePanel() { preYear = new JLabel( "<<", JLabel.CENTER ); preMonth = new JLabel( "<", JLabel.CENTER ); center = new JLabel( "", JLabel.CENTER ); centercontainer = new JLabel( "", JLabel.CENTER ); nextMonth = new JLabel( ">", JLabel.CENTER ); nextYear = new JLabel( ">>", JLabel.CENTER ); preYear.setToolTipText( "Last Year" ); preMonth.setToolTipText( "Last Month" ); nextMonth.setToolTipText( "Next Month" ); nextYear.setToolTipText( "Next Year" ); preYear.setBorder( javax.swing.BorderFactory.createEmptyBorder( 2, 10, 0, 0 ) ); preMonth.setBorder( javax.swing.BorderFactory.createEmptyBorder( 2, 15, 0, 0 ) ); nextMonth.setBorder( javax.swing.BorderFactory.createEmptyBorder( 2, 0, 0, 15 ) ); nextYear.setBorder( javax.swing.BorderFactory.createEmptyBorder( 2, 0, 0, 10 ) ); centercontainer.setLayout( new java.awt.BorderLayout() ); centercontainer.add( preMonth, java.awt.BorderLayout.WEST ); centercontainer.add( center, java.awt.BorderLayout.CENTER ); centercontainer.add( nextMonth, java.awt.BorderLayout.EAST ); this.add( preYear, java.awt.BorderLayout.WEST ); this.add( centercontainer, java.awt.BorderLayout.CENTER ); this.add( nextYear, java.awt.BorderLayout.EAST ); this.setPreferredSize( new java.awt.Dimension( 210, 25 ) ); updateDate(); preYear.addMouseListener( new MyMouseAdapter( preYear, Calendar.YEAR, -1 ) ); preMonth.addMouseListener( new MyMouseAdapter( preMonth, Calendar.MONTH, -1 ) ); nextMonth.addMouseListener( new MyMouseAdapter( nextMonth, Calendar.MONTH, 1 ) ); nextYear.addMouseListener( new MyMouseAdapter( nextYear, Calendar.YEAR, 1 ) ); } private void updateDate() { center.setText( calendar.get( Calendar.YEAR ) + "-" + ( calendar.get( Calendar.MONTH ) + 1 ) ); } // listener for control label. class MyMouseAdapter extends java.awt.event.MouseAdapter { JLabel label; private int type, value; public MyMouseAdapter(final JLabel label, final int type, final int value) { this.label = label; this.type = type; this.value = value; } public void mouseEntered( java.awt.event.MouseEvent me ) { label.setCursor( new java.awt.Cursor( java.awt.Cursor.HAND_CURSOR ) ); label.setForeground( java.awt.Color.RED ); } public void mouseExited( java.awt.event.MouseEvent me ) { label.setCursor( new java.awt.Cursor( java.awt.Cursor.DEFAULT_CURSOR ) ); label.setForeground( java.awt.Color.BLACK ); } public void mousePressed( java.awt.event.MouseEvent me ) { calendar.add( type, value ); label.setForeground( java.awt.Color.WHITE ); refresh(); } public void mouseReleased( java.awt.event.MouseEvent me ) { label.setForeground( java.awt.Color.BLACK ); } } } // body panel, include week labels and day labels. private class BodyPanel extends JPanel { private static final long serialVersionUID = 5677718768457235447L; public BodyPanel() { super( new GridLayout( 7, 7 ) ); this.setPreferredSize( new java.awt.Dimension( 210, 140 ) ); initMonthPanel(); } private void initMonthPanel() { updateDate(); } public void updateDate() { this.removeAll(); lm.clear(); java.util.Date temp = calendar.getTime(); Calendar cal = Calendar.getInstance(); cal.setTime( temp ); cal.set( Calendar.DAY_OF_MONTH, 1 ); int index = cal.get( Calendar.DAY_OF_WEEK ); cal.add( Calendar.DAY_OF_MONTH, defaultStartDAY - index ); for( WeekLabel weekLabel : weekLabels ) { this.add( weekLabel ); } for( int i = 0; i < 42; i++ ) { cal.add( Calendar.DAY_OF_MONTH, 1 ); lm.addLabel( new DayLabel( cal ) ); } for( DayLabel my : lm.getLabels() ) { this.add( my ); } } } private class FooterPanel extends JPanel { private static final long serialVersionUID = 8135037333899746736L; private JLabel dateLabel; public FooterPanel() { super( new BorderLayout() ); initFooterPanel(); } private void initFooterPanel() { dateLabel = new JLabel( "Today is : " + sdf.format( new java.util.Date() ) ); dateLabel.addMouseListener( new MouseListener() { @Override public void mouseReleased( MouseEvent e ) { } @Override public void mousePressed( MouseEvent e ) { calendar.setTime( new Date() ); refresh(); commit(); } @Override public void mouseExited( MouseEvent e ) { dateLabel.setForeground( Color.BLACK ); } @Override public void mouseEntered( MouseEvent e ) { dateLabel.setCursor( new Cursor( Cursor.HAND_CURSOR ) ); dateLabel.setForeground( Color.CYAN ); } @Override public void mouseClicked( MouseEvent e ) { } } ); this.add( dateLabel ); } public void updateDate() { }; } //refresh all panel private void refresh() { titlePanel.updateDate(); bodyPanel.updateDate(); footerPanel.updateDate(); SwingUtilities.updateComponentTreeUI( this ); } private class WeekLabel extends JLabel { private static final long serialVersionUID = -8053965084432740110L; private String name; public WeekLabel(int index, String name) { super( name, JLabel.CENTER ); this.name = name; } public String toString() { return name; } } private class DayLabel extends JLabel implements java.util.Comparator<DayLabel>, java.awt.event.MouseListener, java.awt.event.MouseMotionListener { private static final long serialVersionUID = -6002103678554799020L; private boolean isSelected; private int year, month, day; public DayLabel(Calendar cal) { super( "" + cal.get( Calendar.DAY_OF_MONTH ), JLabel.CENTER ); this.year = cal.get( Calendar.YEAR ); this.month = cal.get( Calendar.MONTH ); this.day = cal.get( Calendar.DAY_OF_MONTH ); this.setFont( font ); this.addMouseListener( this ); this.addMouseMotionListener( this ); if( month == calendar.get( Calendar.MONTH ) ) this.setForeground( java.awt.Color.BLACK ); else this.setForeground( java.awt.Color.LIGHT_GRAY ); } public boolean getIsSelected() { return isSelected; } public void setSelected( boolean b, boolean isDrag ) { isSelected = b; if( b && !isDrag ) { int temp = calendar.get( Calendar.MONTH ); calendar.set( year, month, day ); if( temp == month ) { SwingUtilities.updateComponentTreeUI( bodyPanel ); } else { refresh(); } this.repaint(); } } @Override protected void paintComponent( Graphics g ) { //set curr select day's background if( day == calendar.get( Calendar.DAY_OF_MONTH ) && month == calendar.get( Calendar.MONTH ) ) { g.setColor( new java.awt.Color( 0xBB, 0xBF, 0xDA ) ); g.fillRect( 0, 0, getWidth(), getHeight() ); } //set current day's border if( year == now.get( Calendar.YEAR ) && month == now.get( Calendar.MONTH ) && day == now.get( Calendar.DAY_OF_MONTH ) ) { Graphics2D gd = (Graphics2D) g; gd.setColor( new java.awt.Color( 0x55, 0x55, 0x88 ) ); Polygon p = new Polygon(); p.addPoint( 0, 0 ); p.addPoint( getWidth() - 1, 0 ); p.addPoint( getWidth() - 1, getHeight() - 1 ); p.addPoint( 0, getHeight() - 1 ); gd.drawPolygon( p ); } if( isSelected ) { Stroke s = new BasicStroke( 1.0f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL, 1.0f, new float[] { 2.0f, 2.0f }, 1.0f ); Graphics2D gd = (Graphics2D) g; gd.setStroke( s ); gd.setColor( Color.BLACK ); Polygon p = new Polygon(); p.addPoint( 0, 0 ); p.addPoint( getWidth() - 1, 0 ); p.addPoint( getWidth() - 1, getHeight() - 1 ); p.addPoint( 0, getHeight() - 1 ); gd.drawPolygon( p ); } super.paintComponent( g ); } public boolean contains( Point p ) { return this.getBounds().contains( p ); } private void update() { repaint(); } @Override public void mouseDragged( MouseEvent e ) { } @Override public void mouseMoved( MouseEvent e ) { } @Override public void mouseClicked( MouseEvent e ) { } @Override public void mousePressed( MouseEvent e ) { isSelected = true; update(); } @Override public void mouseReleased( MouseEvent e ) { Point p = SwingUtilities.convertPoint( this, e.getPoint(), bodyPanel ); this.setForeground( Color.BLACK ); lm.setSelect( p, false ); commit(); } @Override // change color when mouse over. public void mouseEntered( MouseEvent e ) { this.setForeground( Color.CYAN ); this.repaint(); } @Override // change color when mouse exit. public void mouseExited( MouseEvent e ) { if( month == calendar.get( Calendar.MONTH ) ) this.setForeground( java.awt.Color.BLACK ); else this.setForeground( java.awt.Color.LIGHT_GRAY ); this.repaint(); } @Override public int compare( DayLabel o1, DayLabel o2 ) { Calendar c1 = Calendar.getInstance(); c1.set( o1.year, o1.month, o1.day ); Calendar c2 = Calendar.getInstance(); c2.set( o2.year, o2.month, o2.day ); return c1.compareTo( c2 ); } } private class LabelManager { private List<DayLabel> list; public LabelManager() { list = new ArrayList<Chooser.DayLabel>(); } public List<DayLabel> getLabels() { return list; } public void addLabel( DayLabel label ) { list.add( label ); } public void clear() { list.clear(); } public void setSelect( Point p, boolean b ) { //如果是拖动,则要优化一下,以提高效率 if( b ) { //表示是否能返回,不用比较完所有的标签,能返回的标志就是把上一个标签和 //将要显示的标签找到了就可以了 boolean findPrevious = false, findNext = false; for( DayLabel lab : list ) { if( lab.contains( p ) ) { findNext = true; if( lab.getIsSelected() ) findPrevious = true; else lab.setSelected( true, b ); } else if( lab.getIsSelected() ) { findPrevious = true; lab.setSelected( false, b ); } if( findPrevious && findNext ) return; } } else { DayLabel temp = null; for( DayLabel m : list ) { if( m.contains( p ) ) { temp = m; } else if( m.getIsSelected() ) { m.setSelected( false, b ); } } if( temp != null ) temp.setSelected( true, b ); } } } /** * @param args */ public static void main( String[] args ) { JFrame jf = new JFrame( "Date Picker Test" ); jf.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); jf.setLayout( null ); jf.setBounds( 400, 200, 600, 400 ); Chooser ser = Chooser.getInstance(); javax.swing.JTextField text = new JTextField(); text.setBounds( 10, 10, 200, 30 ); text.setText( "2013-10-11" ); ser.register( text ); Chooser ser2 = Chooser.getInstance( "yyyy年MM月dd日" ); JLabel label = new JLabel( "please click me." ); label.setBounds( 10, 50, 200, 30 ); ser2.register( label ); jf.add( text ); jf.add( label ); jf.setVisible( true ); }}
0 0
- TimeChooser
- Android应用开发-小巫CSDN博客客户端开发开篇
- 开源HTML5 APP开发神器CanTK发布
- 标签管理组织高层领导了解标签进销存情况是不是所谓的管理型业务用例
- 【Android】getwidth和getmeasuredwidth的区别以及两者的使用场景
- codeigniter读取数据库的公共配置并全局缓存的实现方案
- TimeChooser
- Cocos2d-x-Lua 开发简单的小游戏(记数字踩白块)
- Python 对文档内容TFIDF处理
- STM32L-Power control(PWR)
- STM32L-Power control(PWR)
- MVC一个入门的例子(二)
- Reactor模式和NIO
- [leetcode] 3Sum
- codeforces-#465A. inc ARG(模拟)