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

📄 clock.java

📁 绘制一图形时钟
💻 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 + -