package chapter8;import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;class ClockPanel extends JPanel{
private double minutes=0;
private int RADIUS=100;
private double MINUTE_HAND_LENGTH=0.8*RADIUS;
private double HOUR_HAND_LENGTH=0.6*RADIUS;
public ClockPanel(){
setPreferredSize(new Dimension(2*RADIUS+1,2*RADIUS+1));
}

public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;

Ellipse2D circle=new Ellipse2D.Double(0,0,2*RADIUS,2*RADIUS);
g2.draw(circle);

double hourAngle=Math.toRadians(90-360*minutes/(12*60));
drawHand(g2,hourAngle,HOUR_HAND_LENGTH);

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

}

public void setTime(int h,int m){
minutes=h*60+m;
repaint();
System.out.println("error");
}
}class TextPanel extends JPanel{

}class TextFrame extends JFrame{
private static final int DEAULT_WIDTH=300;
private static final int DEAULT_HEIGHT=300;
private JTextField hourField;
private JTextField minuteField;
private ClockPanel clock;

public TextFrame(){
DocumentListener listener=new ClockFieldListener();

JPanel text=new JPanel();

text.add(new JLabel("Hours:"));
hourField=new JTextField("12",3);
text.add(hourField);
hourField.getDocument().addDocumentListener(listener);


text.add(new JLabel("Minutes:"));
minuteField=new JTextField("00",3);
text.add(minuteField);
minuteField.getDocument().addDocumentListener(listener);

clock=new ClockPanel();

add(clock,BorderLayout.SOUTH);
add(text,BorderLayout.CENTER);

pack();
}

public void setClock(){
try{
int hours=Integer.parseInt(hourField.getText().trim());
int minutes=Integer.parseInt(minuteField.getText().trim());
clock.setTime(hours, minutes);
System.out.println("error");
}
catch(NumberFormatException e){
System.out.println("error2");
}
}

private class ClockFieldListener implements DocumentListener{
public void changedUpdate(DocumentEvent event){
}
public void insertUpdate(DocumentEvent event){
setClock();
}
public void removeUpdate(DocumentEvent event){
setClock();
}
}
}public class TextTest{
public static void main(String[] args){
TextFrame frame=new TextFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}以上代码执行通过时,可以画出表盘.但是输入数据却无法改变.
我本意是容器于Frame类分开控制,但结果动态输入数据却没效果,也就是输入数字后表针无改变.
可是我做以下修改,就可以执行了.把控制动态的部分放入JFrame类中...
package chapter8;import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;class ClockPanel extends JPanel{
private double minutes=0;
private int RADIUS=100;
private double MINUTE_HAND_LENGTH=0.8*RADIUS;
private double HOUR_HAND_LENGTH=0.6*RADIUS;
public ClockPanel(){
setPreferredSize(new Dimension(2*RADIUS+1,2*RADIUS+1));
}

public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;

Ellipse2D circle=new Ellipse2D.Double(0,0,2*RADIUS,2*RADIUS);
g2.draw(circle);

double hourAngle=Math.toRadians(90-360*minutes/(12*60));
drawHand(g2,hourAngle,HOUR_HAND_LENGTH);

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

}

public void setTime(int h,int m){
minutes=h*60+m;
repaint();
System.out.println("error");
}
}class TextPanel extends JPanel{

}class TextFrame extends JFrame{
private static final int DEAULT_WIDTH=300;
private static final int DEAULT_HEIGHT=300;
private JTextField hourField;
private JTextField minuteField;
private ClockPanel clock;

public TextFrame(){
DocumentListener listener=new ClockFieldListener();

JPanel text=new JPanel();

text.add(new JLabel("Hours:"));
hourField=new JTextField("12",3);
text.add(hourField);
hourField.getDocument().addDocumentListener(listener);


text.add(new JLabel("Minutes:"));
minuteField=new JTextField("00",3);
text.add(minuteField);
minuteField.getDocument().addDocumentListener(listener);

clock=new ClockPanel();

add(clock,BorderLayout.SOUTH);
add(text,BorderLayout.CENTER);

pack();
}

public void setClock(){
try{
int hours=Integer.parseInt(hourField.getText().trim());
int minutes=Integer.parseInt(minuteField.getText().trim());
clock.setTime(hours, minutes);
System.out.println("error");
}
catch(NumberFormatException e){
System.out.println("error2");
}
}

private class ClockFieldListener implements DocumentListener{
public void changedUpdate(DocumentEvent event){
}
public void insertUpdate(DocumentEvent event){
setClock();
}
public void removeUpdate(DocumentEvent event){
setClock();
}
}
}public class TextTest{
public static void main(String[] args){
TextFrame frame=new TextFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}请大大指示一下为什么.....

解决方案 »

  1.   

    没人帮忙么???????help me help you~~~
      

  2.   

    在paintComponent方法里加入repaint();就可以重新画图了,可以每隔50ms画一次。Thread.sleep(50);
      

  3.   

    richard_first() 不行...
    我操作还是没有效果.而且在paintComponent中用repaint非常耗资源,差点给我整死机.两段代码还是不同的...有个是一个容器一个类,一个是把所有容器都写在Frame中.我想一个容器一个类好操作和可观性好一点...
      

  4.   

    能够动态画图 用多线程实现 
    import java.awt.*;
    import java.awt.event.*;
    import java.applet.Applet;public class animation1 extends Applet implements Runnable,ActionListener
    {
     
      Thread hThread;
      
      int xx=0,yy=0;
      int x=0;
      Label label1;
      public void init()
      {
          this.setBackground(Color.lightGray);
          label1=new Label("眤翴诀琌:     ");
          this.add(label1);
          Button myButton1=new Button("秨﹍");
          myButton1.addActionListener(this);
          this.add(myButton1);
          Button myButton2=new Button("既氨");
          myButton2.addActionListener(this);
          this.add(myButton2);
          Button myButton3=new Button("膥尿");
          myButton3.addActionListener(this);
          this.add(myButton3);
      }
      public void start()
      {
        //创建线程
        if(hThread==null)
        hThread=new Thread(this); 
        //启动线程
        
      }
      public void actionPerformed(ActionEvent e) 
      {
        if(e.getActionCommand()=="秨﹍") 
        {
         //显示提示消息
         label1.setText("眤翴诀琌:秨﹍");
         hThread.start();
        }
        if(e.getActionCommand()=="既氨")
        {
         label1.setText("眤翴诀琌:既氨");
         hThread.suspend();
        
        }
        if(e.getActionCommand()=="膥尿")
        {
         label1.setText("眤翴诀琌:膥尿");
         hThread.resume();
        }    
      }
     public void run()
     {
      //线程run方法
      while(true) 
      {
        repaint(); 
       
        try
        {
         //线程睡眠时间
         hThread.sleep(20);
        }
        catch(InterruptedException e)
        {}
      }
     }
     public void paint(Graphics g)
     {
       for(int x1=0;x1<=x;x1++)
       {
        double y1=200.0+100.0*Math.sin((double)x1*Math.PI/180.0);
        int x11=x1+1;
        double y11=200.0+100.0*Math.sin((double)x11*Math.PI/180.0);
        g.drawLine(x1,(int)y1,x11,(int)y11);
       }
       x++;
       if(x>360)x=0;
       double y=200.0+100.0*Math.sin((double)x*Math.PI/180.0);
       g.drawLine(xx,yy,x,(int)y);
       xx=x;
       yy=(int)y;
     }
     public void stop() 
     {
       hThread= null; 
     } 
    }
    以前写的 小程序   希望对你有帮助吧
      

  5.   

    如果在这里不能得到满意回答,请尝试到IT付费问答社区www.nlld.net提问
      

  6.   

    我也做过表的程序重新画图也困扰我好久
    我的方法就是在paintComponent()函数的最后加两句话
    Thread.sleep(50);
    repaint();
    起先我想用死循环还重画,结果程序死了,所以我加了一句休眠50ms,程序可以运行。我可以把我的paintComponent函数附给你。
    protected void paintComponent(Graphics g)
    {
    super.paintComponent(g);
    int s=getSecond(),m=getMinute(),h=getHour(),w=getWidth(),ht=getHeight();
    g.setColor(Color.BLACK);
    //g.drawLine(0,0,300,200);
    g.drawOval(w/2-100,ht/2-120,200,200);
    if(m<=9&&s<=9)
    g.drawString(h+":0"+m+":0"+s,w/2-23,ht/2+100);
    else if(m<=9&&s>=10)
    g.drawString(h+":0"+m+":"+s,w/2-23,ht/2+100);
    else if(s<=9&&m>=10)
    g.drawString(h+":"+m+":0"+s,w/2-23,ht/2+100);
    else g.drawString(h+":"+m+":"+s,w/2-23,ht/2+100);
    //画表盘
    for(int i=1;i<=60;i++)
    {

    if(i%5==0)
    {
    g.drawLine((int)(w/2+100*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-20-100*Math.cos(i*2*Math.PI/60)),
    (int)(w/2+87*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-20-87*Math.cos(i*2*Math.PI/60)));
    if(i==15)
    g.drawString(""+i/5,(int)(w/2+13+65*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-15-65*Math.cos(i*2*Math.PI/60)));
    if(i==30)
    g.drawString(""+i/5,(int)(w/2-3+95*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-30-95*Math.cos(i*2*Math.PI/60)));
    if(i==45)
    g.drawString(""+i/5,(int)(w/2+9+95*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-14-95*Math.cos(i*2*Math.PI/60)));
    if(i==60)
    g.drawString(""+i/5,(int)(w/2-7+65*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-28-65*Math.cos(i*2*Math.PI/60)));
    if(i<15)
    g.drawString(""+i/5,(int)(w/2+75*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-20-71*Math.cos(i*2*Math.PI/60)));
    else if (i>30&&i<45)
    g.drawString(""+i/5,(int)(w/2+85*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-18-85*Math.cos(i*2*Math.PI/60)));
    else if(i>45&&i<60)
    g.drawString(""+i/5,(int)(w/2+87*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-20-70*Math.cos(i*2*Math.PI/60)));
    else if(i>15&&i<30)
    g.drawString(""+i/5,(int)(w/2+73*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-20-87*Math.cos(i*2*Math.PI/60)));
    continue;
    }

    g.drawLine((int)(w/2+100*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-20-100*Math.cos(i*2*Math.PI/60)),
    (int)(w/2+92*Math.sin(i*2*Math.PI/60)),
    (int)(ht/2-20-92*Math.cos(i*2*Math.PI/60)));
    }
    // 画表针的轴和表针
    g.fillOval(w/2-5,ht/2-25,10,10);
    g.drawLine(w/2,ht/2-20,(int)(w/2+60*Math.sin((m*60+s)*2*Math.PI/3600)),(int)(ht/2-20-60*Math.cos((m*60+s)*2*Math.PI/3600)));
    if(h>=12)
    g.drawLine(w/2,ht/2-20,(int)(w/2+30*Math.sin(((h-12)*3600+m*60+s)*2*Math.PI/3600/12)),(int)(ht/2-20-30*Math.cos(((h-12)*3600+m*60+s)*2*Math.PI/3600/12)));
    else 
    g.drawLine(w/2,ht/2-20,(int)(w/2+30*Math.sin((h*3600+m*60+s)*2*Math.PI/3600/12)),(int)(ht/2-20-30*Math.cos((h*3600+m*60+s)*2*Math.PI/3600/12)));
    g.setColor(Color.RED);
    g.fillOval(w/2-3,ht/2-23,6,6);
    g.drawLine(w/2,ht/2-20,(int)(w/2+70*Math.sin(s*2*Math.PI/60)),(int)(ht/2-20-70*Math.cos(s*2*Math.PI/60)));
    try {
    Thread.sleep(50);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    repaint();
    }