亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

swing 日期選擇器 界面&代碼

系統 1925 0
    /*
 * DateChooser.java
 *
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */


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.Font;
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.awt.event.MouseMotionListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import javax.swing.SwingUtilities;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;

/**
 *
 * @author hadeslee   修改:xzq
 */
public class DateChooser extends JPanel{
    private Date initDate;
    private Calendar now=Calendar.getInstance();
    private Calendar select;
    private JPanel monthPanel;//月歷
    private JP1 jp1;//四塊面板,組成
    private JP2 jp2;
    private JP3 jp3;
    private JP4 jp4;
    private Font font=new Font("宋體",Font.PLAIN,12);
    private final LabelManager lm=new LabelManager();
    private JLabel showDate;//,toSelect;
    private SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
    private boolean isShow=false;
    private Popup pop;
    /**
     * Creates a new instance of DateChooser
     */
    public DateChooser() {
        this(new Date());
    }
    public DateChooser(Date date){
        initDate=date;
        select=Calendar.getInstance();
        select.setTime(initDate);
        initPanel();
        initLabel();
    }
    public void setEnabled(boolean b){
        super.setEnabled(b);
        showDate.setEnabled(b);
    }
    /**
     *得到當前選擇框的日期
     */
    public Date getDate(){
        return select.getTime();
    }
    //根據初始化的日期,初始化面板
    private void initPanel(){
        monthPanel=new JPanel(new BorderLayout());
        monthPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
        JPanel up=new JPanel(new BorderLayout());
        up.add(jp1=new JP1(),BorderLayout.NORTH);
        up.add(jp2=new JP2(),BorderLayout.CENTER);
        monthPanel.add(jp3=new JP3(),BorderLayout.CENTER);
        monthPanel.add(up,BorderLayout.NORTH);
        monthPanel.add(jp4=new JP4(),BorderLayout.SOUTH);
        this.addAncestorListener(new AncestorListener(){
            public void ancestorAdded(AncestorEvent event) {
                
            }
            
            public void ancestorRemoved(AncestorEvent event) {
                
            }
            //只要祖先組件一移動,馬上就讓popup消失
            public void ancestorMoved(AncestorEvent event) {
                hidePanel();
            }
            
        });
    }
    //初始化標簽
    private void initLabel(){
        showDate=new JLabel(sdf.format(initDate));//初始時間顯示界面
        showDate.setRequestFocusEnabled(true);
        showDate.addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent me){
                showDate.requestFocusInWindow();
            }
        });
//        toSelect=new JLabel(sdf.format(initDate));
//        toSelect.setBorder(BorderFactory.createLineBorder(Color.BLACK));
//        toSelect.setRequestFocusEnabled(true);
        this.setBackground(Color.WHITE);
        this.add(showDate,BorderLayout.CENTER);
//        this.add(toSelect,BorderLayout.EAST);
        this.setPreferredSize(new Dimension(90,25));
        this.setBorder(BorderFactory.createLineBorder(Color.GRAY));
        showDate.addMouseListener(new MouseAdapter(){
            public void mouseEntered(MouseEvent me){
                if(showDate.isEnabled()){
                    showDate.setCursor(new Cursor(Cursor.HAND_CURSOR));
                    showDate.setForeground(Color.RED);
                }
            }
            public void mouseExited(MouseEvent me){
                if(showDate.isEnabled()){
                    showDate.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                    showDate.setForeground(Color.BLACK);
                }
            }
            public void mousePressed(MouseEvent me){
                if(showDate.isEnabled()){
                    showDate.setForeground(Color.CYAN);
                    if(isShow){
                        hidePanel();
                    }else{
                        showPanel(showDate);
                    }
                }
            }
            public void mouseReleased(MouseEvent me){
                if(showDate.isEnabled()){
                    showDate.setForeground(Color.BLACK);
                }
            }
        });
        showDate.addFocusListener(new FocusListener(){
            public void focusLost(FocusEvent e){
                hidePanel();
            }
            public void focusGained(FocusEvent e){
                
            }
        });
    }
    //根據新的日期刷新
    private void refresh(){
        jp1.updateDate();
        jp3.updateDate();
        SwingUtilities.updateComponentTreeUI(this);
    }
    //提交日期
    private void commit(){
        System.out.println("選中的日期是:"+sdf.format(select.getTime()));
        showDate.setText(sdf.format(select.getTime()));
        hidePanel();
    }
    private void hidePanel(){
        if(pop!=null){
            isShow=false;
            pop.hide();
            pop=null;
        }
    }
    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-295){
            x=size.width-295;
        }
        if(y<size.height-170){
        }else{
            y-=188;
        }
        pop=PopupFactory.getSharedInstance().getPopup(owner,monthPanel,x,y);
        pop.show();
        isShow=true;
    }
    private class JP1 extends JPanel{
        JLabel left,right,center;
        public JP1(){
            super(new BorderLayout());
            this.setBackground(new Color(160,185,215));
            initJP1();
        }
        private void initJP1(){
            left=new JLabel(" << ",JLabel.CENTER);
            left.setToolTipText("上一月");
            right=new JLabel(" >> ",JLabel.CENTER);
            right.setToolTipText("下一月");
            left.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));
            right.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));
            center=new JLabel("",JLabel.CENTER);
            updateDate();
            this.add(left,BorderLayout.WEST);
            this.add(center,BorderLayout.CENTER);
            this.add(right,BorderLayout.EAST);
            this.setPreferredSize(new Dimension(295,25));
            left.addMouseListener(new MouseAdapter(){
                public void mouseEntered(MouseEvent me){
                    left.setCursor(new Cursor(Cursor.HAND_CURSOR));
                    left.setForeground(Color.RED);
                }
                public void mouseExited(MouseEvent me){
                    left.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                    left.setForeground(Color.BLACK);
                }
                public void mousePressed(MouseEvent me){
                    select.add(Calendar.MONTH,-1);
                    left.setForeground(Color.WHITE);
                    refresh();
                }
                public void mouseReleased(MouseEvent me){
                    left.setForeground(Color.BLACK);
                }
            });
            right.addMouseListener(new MouseAdapter(){
                public void mouseEntered(MouseEvent me){
                    right.setCursor(new Cursor(Cursor.HAND_CURSOR));
                    right.setForeground(Color.RED);
                }
                public void mouseExited(MouseEvent me){
                    right.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                    right.setForeground(Color.BLACK);
                }
                public void mousePressed(MouseEvent me){
                    select.add(Calendar.MONTH,1);
                    right.setForeground(Color.WHITE);
                    refresh();
                }
                public void mouseReleased(MouseEvent me){
                    right.setForeground(Color.BLACK);
                }
            });
        }
        private void updateDate(){
            center.setText(select.get(Calendar.YEAR)+"年"+(select.get(Calendar.MONTH)+1)+"月");
        }
    }
    private class JP2 extends JPanel{
        public JP2(){
            this.setPreferredSize(new Dimension(295,20));
        }
        protected void paintComponent(Graphics g){
            g.setFont(font);
            g.drawString("星期日 星期一 星期二 星期三 星期四 星期五 星期六",5,10);
            g.drawLine(0,15,getWidth(),15);
        }
    }
    private class JP3 extends JPanel{
        public JP3(){
            super(new GridLayout(6,7));
            this.setPreferredSize(new Dimension(295,100));
            initJP3();
        }
        private void initJP3(){
            updateDate();
        }
        public void updateDate(){
            this.removeAll();
            lm.clear();
            Date temp=select.getTime();
            Calendar select=Calendar.getInstance();
            select.setTime(temp);
            select.set(Calendar.DAY_OF_MONTH,1);
            int index=select.get(Calendar.DAY_OF_WEEK);
            int sum=(index==1?8:index);
            select.add(Calendar.DAY_OF_MONTH,0-sum);
            for(int i=0;i<42;i++){
                select.add(Calendar.DAY_OF_MONTH,1);
                lm.addLabel(new MyLabel(select.get(Calendar.YEAR),
                        select.get(Calendar.MONTH),select.get(Calendar.DAY_OF_MONTH)));
            }
            for(MyLabel my:lm.getLabels()){
                this.add(my);
            }
            select.setTime(temp);
        }
    }
    private class MyLabel extends JLabel implements Comparator<MyLabel>,
            MouseListener,MouseMotionListener{
        private int year,month,day;
        private boolean isSelected;
        public MyLabel(int year,int month,int day){
            super(""+day,JLabel.CENTER);
            this.year=year;
            this.day=day;
            this.month=month;
            this.addMouseListener(this);
            this.addMouseMotionListener(this);
            this.setFont(font);
            if(month==select.get(Calendar.MONTH)){
                this.setForeground(Color.BLACK);
            }else{
                this.setForeground(Color.LIGHT_GRAY);
            }
            if(day==select.get(Calendar.DAY_OF_MONTH)){
                this.setBackground(new Color(160,185,215));
            }else{
                this.setBackground(Color.WHITE);
            }
        }
        public boolean getIsSelected(){
            return isSelected;
        }
        public void setSelected(boolean b,boolean isDrag){
            isSelected=b;
            if(b&&!isDrag){
                int temp=select.get(Calendar.MONTH);
                select.set(year,month,day);
                if(temp==month){
                    SwingUtilities.updateComponentTreeUI(jp3);
                }else{
                    refresh();
                }
            }
            this.repaint();
        }
        protected void paintComponent(Graphics g){
            if(day==select.get(Calendar.DAY_OF_MONTH)&&
                    month==select.get(Calendar.MONTH)){
                //如果當前日期是選擇日期,則高亮顯示
                g.setColor(new Color(160,185,215));
                g.fillRect(0,0,getWidth(),getHeight());
            }
            if(year==now.get(Calendar.YEAR)&&
                    month==now.get(Calendar.MONTH)&&
                    day==now.get(Calendar.DAY_OF_MONTH)){
                //如果日期和當前日期一樣,則用紅框
                Graphics2D gd=(Graphics2D)g;
                gd.setColor(Color.RED);
                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();
        }
        public void mouseClicked(MouseEvent e) {
        }
        
        public void mousePressed(MouseEvent e) {
            isSelected=true;
            update();
        }
        
        public void mouseReleased(MouseEvent e) {
            Point p=SwingUtilities.convertPoint(this,e.getPoint(),jp3);
            lm.setSelect(p,false);
            commit();
        }
        
        public void mouseEntered(MouseEvent e) {
        }
        
        public void mouseExited(MouseEvent e) {
        }
        
        public void mouseDragged(MouseEvent e) {
            Point p=SwingUtilities.convertPoint(this,e.getPoint(),jp3);
            lm.setSelect(p,true);
        }
        
        public void mouseMoved(MouseEvent e) {
        }
        
        public int compare(MyLabel o1, MyLabel o2) {
            Calendar c1=Calendar.getInstance();
            c1.set(o1.year,o2.month,o1.day);
            Calendar c2=Calendar.getInstance();
            c2.set(o2.year,o2.month,o2.day);
            return c1.compareTo(c2);
        }
    }
    private class LabelManager{
        private List<MyLabel> list;
        public LabelManager(){
            list=new ArrayList<MyLabel>();
        }
        public List<MyLabel> getLabels(){
            return list;
        }
        public void addLabel(MyLabel my){
            list.add(my);
        }
        public void clear(){
            list.clear();
        }
        public void setSelect(MyLabel my,boolean b){
            for(MyLabel m:list){
                if(m.equals(my)){
                    m.setSelected(true,b);
                }else{
                    m.setSelected(false,b);
                }
            }
        }
        public void setSelect(Point p,boolean b){
            //如果是拖動,則要優化一下,以提高效率
            if(b){
                //表示是否能返回,不用比較完所有的標簽,能返回的標志就是把上一個標簽和
                //將要顯示的標簽找到了就可以了
                boolean findPrevious=false,findNext=false;
                for(MyLabel m:list){
                    if(m.contains(p)){
                        findNext=true;
                        if(m.getIsSelected()){
                            findPrevious=true;
                        }else{
                            m.setSelected(true,b);
                        }
                    }else if(m.getIsSelected()){
                        findPrevious=true;
                        m.setSelected(false,b);
                    }
                    if(findPrevious&&findNext){
                        return;
                    }
                }
            }else{
                MyLabel temp=null;
                for(MyLabel m:list){
                    if(m.contains(p)){
                        temp=m;
                    }else if(m.getIsSelected()){
                        m.setSelected(false,b);
                    }
                }
                if(temp!=null){
                    temp.setSelected(true,b);
                }
            }
        }
        
    }
    private class JP4 extends JPanel{
        public JP4(){
            super(new BorderLayout());
            this.setPreferredSize(new Dimension(295,20));
            this.setBackground(new Color(160,185,215));
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
            final JLabel jl=new JLabel("今天: "+sdf.format(new Date()));
            jl.setToolTipText("點擊回到今天日期");
            this.add(jl,BorderLayout.CENTER);
            jl.addMouseListener(new MouseAdapter(){
                public void mouseEntered(MouseEvent me){
                    jl.setCursor(new Cursor(Cursor.HAND_CURSOR));
                    jl.setForeground(Color.RED);
                }
                public void mouseExited(MouseEvent me){
                    jl.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                    jl.setForeground(Color.BLACK);
                }
                public void mousePressed(MouseEvent me){
                    jl.setForeground(Color.WHITE);
                    select.setTime(new Date());
                    refresh();
                    commit();
                }
                public void mouseReleased(MouseEvent me){
                    jl.setForeground(Color.BLACK);
                }
            });
        }
    }
    public static void main(String[] args) {
        final DateChooser mp=new DateChooser();
        JFrame jf=new JFrame("test");
        jf.setSize(200,200);
        jf.add(mp,BorderLayout.CENTER);
        jf.add(new JButton("測試用的"),BorderLayout.NORTH);
        jf.pack();
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}




  

? 日期選擇器 界面3 日期選擇器 界面4

?

?

?

?

上面是日期選擇器的界面。

?

?

代碼挺長 但是不難理解。分享之

?

swing 日期選擇器 界面&代碼


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久成人在线观看 | 成人美女免费网站视频 | 免费看91毛片| 亚洲视频成人 | 国产亚洲综合一区二区在线 | 欧美一级毛片在线播放 | 色综合天天综合网站中国 | 深夜影院在线 | 日本精品一区二区三区在线观看 | 麻豆久久精品免费看国产 | 亚洲视频在线观看一区 | 国产成人亚洲综合 | 日本高清免费不卡视频 | www.xxx欧美| 欧美大片日韩精品四虎影视 | 亚洲综合日韩 | 国产亚洲欧美一区 | 欧美人交性视频在线香蕉 | 欧美a视频| 亚洲欧美在线视频 | 日本大蕉香蕉大视频在线观看 | 一级黄片一级毛片 | 日本不卡网站 | 香蕉视频国产 | 免费日韩毛片 | 色婷婷网 | 一区二区三区在线免费观看视频 | 色狠狠成人综合网 | 成人永久福利在线观看不卡 | 国产福利在线观看永久免费 | 久久99久久精品97久久综合 | 国产精品一区不卡 | 国产在线精品一区二区 | 狠狠操在线观看 | 久久综合九色综合97婷婷女人 | 一级一级毛片 | 成人免费淫片在线费观看 | 国产亚洲欧美一区 | 国产高清不卡一区二区三区 | 欧美激情免费 | 91精品国产乱码久久久久久 |