📄 clock.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 + -