文本域的变化跟踪----时钟的显示

本域的变化跟踪----时钟的显示

    实现的代码如下:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.text.*;
import javax.swing.*;
import javax.swing.event.*;


public class TextTest
{
public static void main(String[] args)
    {
       TextTestFrame frame=new TextTestFrame();
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setVisible(true);
 }
}
// A frame with two text fields to set a clock.
class TextTestFrame extends JFrame
{
 public TextTestFrame()
 {
  setTitle("TextTest");
  DocumentListener listener=new ClockFieldListener();
  
  //add a panel with text fields.
  JPanel panel=new JPanel();
  panel.add(new JLabel("Hours:"));
  //hourField=new JTextField("12",3);
  
  hourField=new JFormattedTextField(NumberFormat.getIntegerInstance());
  hourField.setValue(new Integer(12));
  hourField.setInputVerifier(new FormattedTextFieldVerifier());
  
  panel.add(hourField);
  hourField.getDocument().addDocumentListener(listener);
  
  panel.add(new JLabel("Minutes:"));
  
  //minuteField=new JTextField("00",3);
  minuteField=new JFormattedTextField(NumberFormat.getIntegerInstance());
  minuteField.setValue(new Integer(30));
  minuteField.setInputVerifier(new FormattedTextFieldVerifier());
  
  panel.add(minuteField);
  minuteField.getDocument().addDocumentListener(listener);
  
  add(panel,BorderLayout.SOUTH);
  
  //add the clock.
  
  clock =new ClockPanel();
  add(clock,BorderLayout.CENTER);
  pack();
 }
 //set the clock to the values stored in the text fields.
 public void setClock()
 {
  try
  {
   int hours=Integer.parseInt(hourField.getText().trim());
   int minutes=Integer.parseInt(minuteField.getText().trim());
   clock.setTime(hours,minutes);
  }
  catch(NumberFormatException e)
  {
   e.printStackTrace();
  }
 }
 //public static final int DEFAULT_WIDTH=300;
 //public static final int DEFAULT_HEIGHT=300;
 
 private JFormattedTextField hourField;
 private JFormattedTextField minuteField;
 
 //private JTextField hourField;
 //private JTextField minuteField;
 private ClockPanel clock;
 
 private class ClockFieldListener implements DocumentListener
 {
  public void insertUpdate(DocumentEvent event){
   setClock();
  }
  public void removeUpdate(DocumentEvent event){
   setClock();
  }
  public void changedUpdate(DocumentEvent event){}
 }
}
//A panel that draws a clock.
class ClockPanel extends JPanel{
 public ClockPanel()
 {
  setPreferredSize(new Dimension(2*RADIUS+1,2*RADIUS+1));
 }
 public void paintComponent(Graphics g)
 {
  //draw the circular boundary
  super.paintComponent(g);
  Graphics2D g2=(Graphics2D) g;
  Ellipse2D circle=new Ellipse2D.Double(0,0,2*RADIUS,2*RADIUS);
  g2.draw(circle);
  
  //draw the hour hand
  double hourAngle=Math.toRadians(90-360*minutes/(12*60));//将用角度表示的角转换为近似相等的用弧度表示的角。
  drawHand(g2,hourAngle,HOUR_HAND_LENGTH);
  
  //draw the minute hand
  double minuteAngle=Math.toRadians(90-360*minutes/60);//将用角度表示的角转换为近似相等的用弧度表示的角。
  drawHand(g2,minuteAngle,MINUTE_HAND_LENGTH);
 }
 public void drawHand(Graphics2D g2,double angle,double handLength)
 {
  Point2D end=new Point2D.Double(RADIUS+handLength*Math.cos(angle),RADIUS-handLength*Math.sin(angle));
  Point2D center=new Point2D.Double(RADIUS,RADIUS);
  g2.draw(new Line2D.Double(center,end));
 }
 //Set the time to be displayed on the clock
 public void setTime(int h,int m)
 {
  minutes=h*60+m;
  repaint();
 }
 private double minutes=0;
 private int RADIUS=100;
 private double MINUTE_HAND_LENGTH=0.8*RADIUS;
 private double HOUR_HAND_LENGTH=0.6*RADIUS;
}
//检验器程序。只有输入数字时才有效。
class FormattedTextFieldVerifier extends InputVerifier
{
 public boolean verify(JComponent component)
 {
  JFormattedTextField field=(JFormattedTextField)component;
  return field.isEditValid();
 }
}
此程序实现的功能主要是显示一个时钟,并且带有两个文本域用来输入小时和分钟。只要这两个文本域中的内容发生变化,时钟就会跟着改变。

posted @ 2010-04-05 17:07  月亮的影子  阅读(305)  评论(0编辑  收藏  举报