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

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

    实现的代码如下:

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();

 }

}

此程序实现的功能主要是显示一个时钟,并且带有两个文本域用来输入小时和分钟。只要这两个文本域中的内容发生变化,时钟就会跟着改变。


                            

你可能感兴趣的:(显示)