📄 clock.java
字号:
import java.text.DecimalFormat;
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.*;
public class Clock extends JFrame{
private JPanel clockShowPanel, clockStrPanel;
private JTextField hField, mField, sField;
private JLabel colonLabel,colonLabel2;
private JButton resetButton;
private static Calendar calendar;
private int hour = 0;
private int minute = 0;
private int second = 0;
//修改时间的通行证,由鼠标点击,键入值决定
private boolean permit = true;
private boolean b = false;
private boolean bt = false;
private Color colorMB = new Color(192,237,242);
private Color colorHB = colorMB;
//时钟图形坐标及长度宽度
private final int x0 = 50;
private final int y0 = 50;
private final int xl = 100;
private final int yl = 150;
//定义弧线,取其终点坐标以便绘制时针、分针、秒针及时钟轮廓
private Arc2D.Double arcO = null;
private Arc2D.Double arcI = null;
private Arc2D.Double secondArc = null;
private Arc2D.Double minuteArc = null;
private Arc2D.Double hourArc = null;
private MouseClickHandler handler = new MouseClickHandler();
DecimalFormat twoDigits = new DecimalFormat("00");
public Clock(){
super( "Time..." );
Container container = getContentPane();
clockShowPanel = new JPanel();
container.add( clockShowPanel, BorderLayout.NORTH );
clockStrPanel = new JPanel();
container.add( clockStrPanel, BorderLayout.SOUTH );
calendar = new GregorianCalendar();
hField = new JTextField(2);
hField.setEditable(false);
hField.addMouseListener(handler);
hField.addKeyListener( //允许键入00~23的数值
new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(permit==true){
if( b==false && e.getKeyChar()>=KeyEvent.VK_0 &&
e.getKeyChar()<=KeyEvent.VK_9 ){
hField.setText(""+e.getKeyChar());
if( e.getKeyChar() <= KeyEvent.VK_2 ){
b = true;
if(e.getKeyChar() == KeyEvent.VK_2)
bt = true;
}
}
else if( b==true ){
if( bt==false && e.getKeyChar()>=KeyEvent.VK_0 &&
e.getKeyChar()<=KeyEvent.VK_9 )
hField.setText( hField.getText() + e.getKeyChar() );
else if( bt==true && e.getKeyChar()>=KeyEvent.VK_0 &&
e.getKeyChar()<=KeyEvent.VK_3 )
hField.setText( hField.getText() + e.getKeyChar() );
permit = false;
}
}
}
}
);
clockStrPanel.add( hField );
colonLabel = new JLabel( ":" );
clockStrPanel.add( colonLabel );
mField = new JTextField(2);
mField.setEditable(false);
mField.addMouseListener(handler);
mField.addKeyListener( //允许键入00~59的数值
new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(permit==true){
if( b==false && e.getKeyChar()>=KeyEvent.VK_0 &&
e.getKeyChar()<=KeyEvent.VK_9 ){
mField.setText(""+e.getKeyChar());
if( e.getKeyChar() <= KeyEvent.VK_5 )
b = true;
}
else if( b==true && e.getKeyChar()>=KeyEvent.VK_0 &&
e.getKeyChar()<=KeyEvent.VK_9 ){
mField.setText( mField.getText() + e.getKeyChar() );
permit = false;
}
}
}
}
);
clockStrPanel.add( mField );
colonLabel2 = new JLabel( ":" );colonLabel2.setToolTipText("sjdha");
clockStrPanel.add( colonLabel2 );
sField = new JTextField(2);
sField.setEditable(false);
sField.addMouseListener(handler);
sField.addKeyListener( //允许键入00~59的数值
new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(permit==true){
if( b==false && e.getKeyChar()>=KeyEvent.VK_0 &&
e.getKeyChar()<=KeyEvent.VK_9 ){
sField.setText(""+e.getKeyChar());
if( e.getKeyChar() <= KeyEvent.VK_5 )
b = true;
}
else if( b==true && e.getKeyChar()>=KeyEvent.VK_0 &&
e.getKeyChar()<=KeyEvent.VK_9 ){
sField.setText( sField.getText() + e.getKeyChar() );
permit = false;
}
}
}
}
);
clockStrPanel.add( sField );
resetButton = new JButton("reset");
resetButton.setEnabled(false);
resetButton.addActionListener( //重新设置为新的时间
new ActionListener(){
public void actionPerformed(ActionEvent e){
if( !(hField.getText().equals("") || mField.getText().equals("") || sField.getText().equals("")) ){
setTime( Integer.parseInt(hField.getText()), Integer.parseInt(mField.getText()),
Integer.parseInt(sField.getText()) );
resetButton.setEnabled(false);
}
}
}
);
clockStrPanel.add(resetButton);
setTime();
setSize( 200, 270 );
setVisible( true );
}
public void setTime(){ //设置时间为系统时间
hour = calendar.get(Calendar.HOUR_OF_DAY);
hField.setText( twoDigits.format(hour) );
minute = calendar.get(Calendar.MINUTE);
mField.setText( twoDigits.format(minute) );
second = calendar.get(Calendar.SECOND);
sField.setText( twoDigits.format(second) );
}
public void setTime( int h, int m, int s ){ //设置新时间
hour = h;
hField.setText( twoDigits.format(hour) );
minute = m;
mField.setText( twoDigits.format(minute) );
second = s;
sField.setText( twoDigits.format(second) );
}
private class MouseClickHandler extends MouseAdapter{
public void mouseClicked(MouseEvent e){
permit = true;
b = false;
resetButton.setEnabled(true);
hField.setBackground(Color.WHITE);
mField.setBackground(Color.WHITE);
sField.setBackground(Color.WHITE);
if( e.getSource() == hField )
hField.setText("");
if( e.getSource() == mField )
mField.setText("");
if( e.getSource() == sField )
sField.setText("");
}
}
public class ClockThread extends Thread {
public void run(){
while(true){
try{
Thread.sleep( 1000 );
}
catch( InterruptedException e ){
e.printStackTrace();
}
//以秒为单位计时
second = second + 1;
sField.setText( twoDigits.format(second) );
if( second%60 == 0 ){
second = 0;
sField.setText("00");
minute = minute + 1;
mField.setText( twoDigits.format(minute) );
if( minute%60 == 0 ){
minute = 0;
mField.setText("00");
hour = hour + 1;
if( hour%24 == 0 ){
hour = 0;
hField.setText( "00" );
}
else
hField.setText( twoDigits.format(hour) );
}
}
drawClock();
}
}
}
public void paint( Graphics g ){
super.paint( g );
Graphics2D g2d = (Graphics2D)g;
//绘制时钟大背景
g2d.setPaint( colorMB );
g2d.fillOval( x0, y0, xl, yl );
//绘制时钟大背景
g2d.setPaint( colorHB );
g2d.fillOval( x0+xl/6, y0+yl/6, xl*2/3, yl*2/3 );
//绘制钟点指示线段
for( int i=0; i<=60; i++ ){
arcO = new Arc2D.Double( x0, y0, xl, yl, 0, 6*i, Arc2D.OPEN );
arcI = new Arc2D.Double( x0-xl/24, y0-yl/24, xl*13/12, yl*13/12, 0, 6*i,Arc2D.OPEN );
if( i%5 == 0 ){
g2d.setPaint( Color.BLUE );
g2d.setStroke( new BasicStroke(2.0f) );
g2d.draw( new Line2D.Double( arcO.getEndPoint().getX(), arcO.getEndPoint().getY(),
arcI.getEndPoint().getX(), arcI.getEndPoint().getY() ) );
}
else{
g2d.setPaint( Color.MAGENTA );
g2d.setStroke( new BasicStroke(1.0f) );
g2d.draw( new Line2D.Double( arcO.getEndPoint().getX(), arcO.getEndPoint().getY(),
arcI.getEndPoint().getX(), arcI.getEndPoint().getY() ) );
}
}
//绘制秒针
secondArc = new Arc2D.Double( x0, y0, xl, yl, 0, 90-second*6, Arc2D.OPEN );
g2d.setPaint( Color.RED );
g2d.setStroke( new BasicStroke(1.0f) );
g2d.draw( new Line2D.Double( x0+xl/2, y0+yl/2, secondArc.getEndPoint().getX(),
secondArc.getEndPoint().getY() ) );
//绘制分针
minuteArc = new Arc2D.Double( x0, y0, xl, yl, 0, 90-minute*6-(double)second/10, Arc2D.OPEN );
g2d.setPaint( Color.ORANGE );
g2d.setStroke( new BasicStroke(2.0f) );
g2d.draw( new Line2D.Double( x0+xl/2, y0+yl/2, minuteArc.getEndPoint().getX(),
minuteArc.getEndPoint().getY() ) );
//绘制时针
hourArc = new Arc2D.Double( x0+xl/6, y0+yl/6, xl*2/3, yl*2/3, 0,
90-hour*30-(double)minute/2-(double)second/120, Arc2D.OPEN );
g2d.setPaint( Color.BLUE );
g2d.setStroke( new BasicStroke(3.0f) );
g2d.draw( new Line2D.Double( x0+xl/2, y0+yl/2, hourArc.getEndPoint().getX(),
hourArc.getEndPoint().getY() ) );
}
public void drawClock(){
repaint();
}
public static void main( String args[] ){
Clock clock = new Clock();
ClockThread clockThread = clock.new ClockThread();
clockThread.start();
clock.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -