⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.java

📁 设置日期时间属性 实验目的:综合运用组件、日期类、日历类、线程等设计方法。 题意 请设计类似Windows系统中“设置日期时间属性”的窗口及功能
💻 JAVA
字号:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.Calendar;
import java.util.Date;
import java.text.*;
import java.util.*;

public class Clock extends JPanel implements MouseMotionListener, MouseListener
{	final private String TITLES[] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};//成员变量
    final private int ROW_HEIGHT = 20;//表格高      
    final private int ROW_WIDTH = 40;//表格宽
    
    private JTable table; // 表格
    private JLabel title; // 标题
    private JButton nextYear; // 下一年的按钮
    private JButton preYear; // 上一年的按钮
    private Choice ch1;//月份选择框
    private JPanel top; // 顶部容器

    private int year; // 当前显示的年份
    private int month; // 当前显示的月份
    private int day; // 当前选择的日期
    private int week,week1; // 当前选择的星期
    private int selectedX = -1;
    private int selectedY = -1;
    private int clickX = -1;
    private int clickY = -1;
    Panel p2=new Panel();
    CardLayout myCard=new CardLayout();
     
    public Clock()    //构造方法日历类
    {
    	Calendar cal = Calendar.getInstance();//创建日历对象
        cal.setTime(new Date());//设置时间为当前时间

        year = cal.get(Calendar.YEAR);
        month = cal.get(Calendar.MONTH);
        day = cal.get(Calendar.DAY_OF_MONTH);
        week = cal.get(Calendar.DAY_OF_WEEK);
 
        top = new JPanel(new FlowLayout(FlowLayout.CENTER));
        table = new JTable(7,7);//创建表格

        table.setPreferredSize(new Dimension(ROW_WIDTH * 7, ROW_HEIGHT * 7));//表格大小
        table.setRowHeight(ROW_HEIGHT);
        
        for(int i=0; i<TITLES.length; i++)
        table.setValueAt(TITLES[i],0,i);//表格的头设置
        
        title = new JLabel();
        nextYear = new JButton("上一年");
        preYear = new JButton("下一年");
       
        top.add(preYear);
        top.add(title);
        top.add(nextYear);
        
        ch1=new Choice();
		ch1.addItem("一月");
		ch1.addItem("二月");
		ch1.addItem("三月");
	    ch1.addItem("四月");
		ch1.addItem("五月");
		ch1.addItem("六月");
		ch1.addItem("七月");
		ch1.addItem("八月");
		ch1.addItem("九月");
		ch1.addItem("十月");
		ch1.addItem("十一月");
		ch1.addItem("十二月");
		top.add(ch1);
		
        setTitle();//通过它来设置当前年份151
        table.setEnabled(false);
        setLayout(new BorderLayout());

        add(top, BorderLayout.NORTH);
        add(table, BorderLayout.CENTER);

        
        ch1.addItemListener(new java.awt.event.ItemListener()//注册监听,并实现方法,对选择框触发
        {
        	public void itemStateChanged(ItemEvent e)
        	{
        		for(int i=0;i<12;i++)
        		if(ch1.getSelectedIndex()==i)
                month=i+1;
         
                showMonth();
         
        
            }
        });
         
        preYear.addActionListener(new java.awt.event.ActionListener()//对按钮触发
        {
        	public void actionPerformed(ActionEvent e)
        	{
        	  	year--;
        	    if(year<1970)
               year =2080;
                setTitle();
                showMonth();
        	}
        });
        
        nextYear.addActionListener(new java.awt.event.ActionListener()
        {
        	public void actionPerformed(ActionEvent e)
        	{
        		year++;
                if(year>2080)

                year=1970;
        		setTitle();
                showMonth();
        	}
        });
        
        showMonth();
        
        table.setCellSelectionEnabled(false);

        table.addMouseMotionListener(this);
        table.addMouseListener(this);
    }
    //取得指定年份和月份的日期数
    public int getDaysOfMonth(int year, int month)   // 判断是否闰年//每月的最大天数

    {
    	int Days[]= {31 ,28,31,30,31,30,31,31,30,31,30,31};
        
        if( year % 400 == 0 || (year % 4 ==0 && year % 100 != 0)) // 说明是闰年
        Days[1] = 29;

        return Days[month-1];
    }
     //取得指定月份的头一天的星期几
    public int getWeekOfFirstDay(int year, int month)
    {
    	Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month - 1);
        cal.set(Calendar.DAY_OF_MONTH, 1);

        int result = cal.get(Calendar.DAY_OF_WEEK) - 1;
        return result ;
    } 
     
    private void setTitle()//设置标题
    {
    	
        title.setText(String.valueOf(year)+"年");
    } 
    
    private void showMonth()  //显示月份
    {
       for(int x=0; x<7; x++)
       for(int y=1; y<7; y++) table.setValueAt("",y, x);

       int y = 1;
       int x = getWeekOfFirstDay(year, month);//获得该月的头一天是星期几
       int maxDay = getDaysOfMonth(year,month);//获得该月最大天数

       for(int i=0; i<maxDay; i++)
       {
       	    table.setValueAt(new Integer(i+1),y,x);

            x ++;
            if(x>6)
            {
               x=0;
               y++;
            }
        }
        repaint();
    } 
   
    public void paint(Graphics g)  //画日历
    {
    	super.paint(g);
    	g.fillRect(0,top.getHeight(), getWidth()-1, ROW_HEIGHT -1);
    	
        g.setColor(new Color(255,255,255));//设颜色table的表头颜色
        for(int i=0; i<7; i++)
        g.drawString((String)(table.getModel().getValueAt(0,i)),i*ROW_WIDTH, top.getHeight()+ ROW_HEIGHT - 3);
        
        
        if(selectedX >= 0 && selectedY>= 0 && ! table.getModel().getValueAt(selectedY,selectedX).equals(""))
     {
        g.setColor(Color.LIGHT_GRAY);
        g.drawRect(selectedX * ROW_WIDTH+1, (selectedY + 2) * ROW_HEIGHT -1 ,ROW_WIDTH-4,ROW_HEIGHT-4);
     }

     if(clickY >= 0 && clickX >= 0 & ! table.getModel().getValueAt(clickY,clickX).equals(""))
     {
       g.setColor(Color.green);
      g.drawRect(clickX * ROW_WIDTH+1, (clickY + 2) * ROW_HEIGHT -1 ,ROW_WIDTH-4,ROW_HEIGHT-4);
      }
     }

   public void mouseDragged(MouseEvent e){}

   public void mouseMoved(MouseEvent e)  //实现鼠标在table中移动的方法
   {
    if(e.getX()>0 && e.getY()<getWidth() && e.getY()> ROW_HEIGHT && e.getY()< ROW_HEIGHT * 7 )
   {
     selectedX = e.getX() / ROW_WIDTH;
     selectedY = e.getY() / ROW_HEIGHT;

     repaint();
   }
  }

public void mouseClicked(MouseEvent e) {}

public void mousePressed(MouseEvent e)
{
if(e.getX()>0 && e.getY()<getWidth() && e.getY()> ROW_HEIGHT && e.getY()< ROW_HEIGHT * 7 )
{
clickX = e.getX() / ROW_WIDTH;
clickY = e.getY() / ROW_HEIGHT;

repaint();
}
}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}

public void display()     //面板显示
   {
   	    Frame frm=new Frame("时间/日期属性设置面板");
   	    Choice ch2;
        frm.setSize(400,500);
        frm.setLocation(50,150);
        frm.setBackground( Color.LIGHT_GRAY);
        JTabbedPane pane1=new JTabbedPane();
        Panel p1=new Panel();
        Panel p11=new Panel();
        Panel p12=new Panel();
        Panel p111=new Panel();
        Panel p121=new Panel();
        Panel p21=new Panel();
        Panel p22=new Panel();
        Panel p3=new Panel();
       
        
        Button b1=new Button("确定");
        Button b2=new Button("取消");
        Button b3=new Button("应用");
        Button b4=new Button("(GMT+08:00)北京,重庆,香港特别行政区,乌鲁木齐");
        Button b5=new Button("(GMT-06:00)中部时间(美国和加拿大)");
        
        
       
        b2.addActionListener(new java.awt.event.ActionListener()
        {
        	public void actionPerformed(ActionEvent e)
        	{
        		System.exit(0);
        	}
        });
        b3.setEnabled(false);
         
        frm.setResizable(false);
        frm.addWindowListener(new WinClose());   //框架frm注册监听程序             
         
        
        frm.add(pane1,"North");   
        frm.add(p3,"South");                //日期和时间标签页;
        pane1.add("日期/时间",p1);
        pane1.add("时区",p2);
        
        p1.setLayout(new GridLayout(1,2));
        p11.setLayout(new BorderLayout());
        p1.add(p12);
        p11.add(new Clock());
        p11.add(p111,"South");
        Label x=new Label("时区:东八区     设计者:胡亮贤6班9号");
        p111.add(x);
        p1.add(p11);
        Clock1 c1=new Clock1();
        Thread c2=new Thread(c1);
        c2.start();
        c1.setVisible(true);
        p12.setLayout(new BorderLayout());
        p12.add(c1);
        p12.add(p121,"South");
        p3.setLayout(new FlowLayout(FlowLayout.RIGHT));
        p3.add(b1,"South");
        p3.add(b2,"South");
        p3.add(b3,"South");
        frm.setVisible(true);
        frm.pack();
        frm.show();
        
        
        myCard = new CardLayout();
        p2.setLayout(myCard);
        
        p21.setLayout(new BorderLayout());
        p22.setLayout(new BorderLayout());
        
        p21.add(b4,"North");
        p22.add(b5,"North");
        p2.add(p21, "First");
 		p2.add(p22, "Second");
 		myCard.show(p2, "First");
       
         
   }
  
   
   class WinClose extends WindowAdapter
   {
   	   public void windowClosing(WindowEvent e)
   	   {
   		     System.exit(0);
   	   }
   }
   

  


   public class Clock1 extends Panel implements Runnable    //绘画时钟,
   {
   	    Thread timer=null;
	    int lastxs=0,lastys=0,lastxm=0,lastym=0,lastxh=0,lastyh=0;
	    String to="ddddd";
        public Clock1()
	    {
	 
		    setBackground(new Color(189,215,238));
        }
        public void paint(Graphics g)
        {
        	int xh,yh,xm,ym,xs,ys;
		    int s,m,h,xcenter,ycenter;
		    Date now=new Date();//获取当前日期时间
		    String today=now.toLocaleString();//时间对应的字符串
		    s=now.getSeconds();
		    m=now.getMinutes();
		    h=now.getHours();
		    xcenter=150;       //钟的原点
		    ycenter=80;
		    xs = (int)(Math.cos(s * 3.14f/30 - 3.14f/2) * 45 + xcenter);//计算秒针、分针、时针的位置
            ys = (int)(Math.sin(s * 3.14f/30 - 3.14f/2) * 45 + ycenter);
            xm = (int)(Math.cos(m * 3.14f/30 - 3.14f/2) * 40 + xcenter);
            ym = (int)(Math.sin(m * 3.14f/30 - 3.14f/2) * 40 + ycenter);
            xh = (int)(Math.cos((h*30+m/2)*3.14f/180-3.14f/2)*30+xcenter);
            yh = (int)(Math.sin((h*30+m/2)*3.14f/180-3.14f/2)*30+ycenter);
            g.setFont(new Font("TimesRoman", Font.PLAIN, 14));
            g.setColor(Color.yellow);
            g.drawArc(xcenter-50,ycenter-50,100,100,0,360);   //画弧
             
            g.setColor(Color.blue);
            g.drawString("9",xcenter-45,ycenter+3); //时钟上数字的位置
            g.drawString("3",xcenter+40,ycenter+3);
            g.drawString("12",xcenter-5,ycenter-37);
            g.drawString("6",xcenter-3,ycenter+45);
            g.setColor(getBackground());//用背景色画线可以消除原来画的线
            if (xs != lastxs || ys != lastys)          //秒针变化
            {
            	g.drawLine(xcenter, ycenter, lastxs, lastys);
              
            }
            if (xm != lastxm || ym != lastym)          //分针变化
            {
            	g.drawLine(xcenter, ycenter-1, lastxm, lastym);
                g.drawLine(xcenter-1, ycenter, lastxm, lastym); 
            }
            if (xh != lastxh || yh != lastyh)          //时针变化
            {
                g.drawLine(xcenter, ycenter-1, lastxh, lastyh);
                g.drawLine(xcenter-1, ycenter, lastxh, lastyh); 
            }
            if(to!=today)
            {
            	g.setColor(getBackground());
            	g.drawString(to, 100, 150); //消去数字时钟
            }
            g.setColor(Color.PINK);                //显示数字时钟
            g.drawString(today, 100, 150);
            to=today;  
            g.setColor(Color.red);                    //画新指针
            g.drawLine(xcenter, ycenter, xs, ys);
            g.drawLine(xcenter, ycenter-1, xm, ym);
            g.drawLine(xcenter-1, ycenter, xm, ym);
            g.drawLine(xcenter, ycenter-1, xh, yh);
            g.drawLine(xcenter-1, ycenter, xh, yh);
            lastxs=xs; lastys=ys;                      //保存指针位置
            lastxm=xm; lastym=ym;
            lastxh=xh; lastyh=yh;
	    }
	     public void run()                    //每隔一秒钟,刷新一次画面
	     {
	     	while (timer==null) //timer线程
	     	{
	     		try 
	     		{
	     			Thread.sleep(1000);
                }
                catch (InterruptedException e) {}
                repaint();                  //调用paint()方法重画时钟
           }
        
        }
        public void update(Graphics g) 
        {
        	paint(g);                        //重写该方法是为了消除抖动现象
        }
   }
   
  
   
   
 public static void main(String args[])
   {
   	   (new Clock()).display();
   }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -