大家好,请高手帮忙修改下代码,我的原意是设计一个闹钟程序,输入时间,在时间到后,时钟的前景和背景颜色会交替变色。但是我用了两个方法都没法做到,程序也未报错,请高手帮忙修改下!谢谢!
第一种方法代码:
 import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class testcl6 implements  ActionListener,Runnable{     Frame f,f1;
      Label b,b1,b2;
  Panel p;
  TextField t1,t2;
  Button b3;
  GregorianCalendar gc;
  String y,w,m;
      String t3,t4;
      Thread t,nn;
 
public static void main(String[] args) 
{
new testcl6();
}
public  testcl6()
{ f=new Frame("test clock");
      f.addWindowListener(new WindowAdapter()
{   public void windowClosing(WindowEvent e)
{System.exit(0);
}
}
);
       b1=new Label("xiaoshi");
   b2=new Label("fenzhong");
   t1=new TextField();
   t2=new TextField();
   b3=new Button("shuru");
   t1.addActionListener(this);
   t2.addActionListener(this);
   b3.addActionListener(this);
   p=new Panel(new GridLayout(1,5));
       p.add(b1);
   p.add(t1);
   p.add(b2);
   p.add(t2);
   p.add(b3);
   b=new Label(gettime(),Label.CENTER);
       b.setFont(new Font("Arial",Font.PLAIN,36));
   f.add(p,BorderLayout.NORTH);
   f.add(b,BorderLayout.CENTER);
   f.pack();
   f.setVisible(true);
       t=new Thread(this);
   t.start();
   nn=new Thread(new no());

}
 public void actionPerformed(ActionEvent e)
{     t3=t1.getText();
     t4=t2.getText();
  System.out.println(t3+t4);
         t1.setText("");
 t2.setText("");
 
}public void run()

 if ((Integer.parseInt(t3)==gc.get(GregorianCalendar.HOUR_OF_DAY))&&(Integer.parseInt(t4)==gc.get(GregorianCalendar.MINUTE)))
             
{

   try
{nn.join(60000);}
catch (InterruptedException e)
   {     System.err.println(e);
}
}
else {     while (true)
           try {    

        Thread.sleep(1000);
        b.setText(gettime());
  }
catch (InterruptedException e)
   {     System.err.println(e);
}      }

 

 }

  public String gettime()
{     GregorianCalendar gc=new GregorianCalendar();
      
     return 
    gc.get(GregorianCalendar.HOUR_OF_DAY)+":"+
    gc.get(GregorianCalendar.MINUTE)+":"+
    gc.get(GregorianCalendar.SECOND);
 
  
}
public class no implements Runnable
{        public void run()
{      while (true)
{   try
   {    Thread.sleep(1000);
     b.setForeground(Color.green);
 b.setBackground(Color.white);
  b.setText(gettime());
  Thread.sleep(1000);
  b.setText(gettime());
  b.setForeground(Color.red);
          b.setBackground(Color.yellow);
   }
   catch (InterruptedException e)
   {     System.err.println(e);
}
} }
}}第二种方法代码:
import java.awt.*;
import java.awt.event.*;
import java.util.*;public class testcl7 implements  ActionListener,Runnable{     Frame f,f1;
      Label b,b1,b2;
  Panel p;
  TextField t1,t2;
  Button b3;
  GregorianCalendar gc;
  String y,w,m;
      String t3,t4;
      Thread t,nn;
 
public static void main(String[] args) 
{
new testcl7();

}
public  testcl7()
{ f=new Frame("test clock");
      f.addWindowListener(new WindowAdapter()
{   public void windowClosing(WindowEvent e)
{System.exit(0);
}
}
);
       b1=new Label("xiaoshi");
   b2=new Label("fenzhong");
   t1=new TextField();
   t2=new TextField();
   b3=new Button("shuru");
   t1.addActionListener(this);
   t2.addActionListener(this);
   b3.addActionListener(this);
   p=new Panel(new GridLayout(1,5));
       p.add(b1);
   p.add(t1);
   p.add(b2);
   p.add(t2);
   p.add(b3);
   b=new Label(gettime(),Label.CENTER);
       b.setFont(new Font("Arial",Font.PLAIN,36));
   f.add(p,BorderLayout.NORTH);
   f.add(b,BorderLayout.CENTER);
   f.pack();
   f.setVisible(true);
     t=new Thread(this);
     nn=new Thread(new no());
     t.start();
     nn.start();   nao();
       

}
 public void actionPerformed(ActionEvent e)
{     t3=t1.getText();
     t4=t2.getText();
  System.out.println(t3+t4);
         t1.setText("");
 t2.setText("");
 
}public void run()


 while (true)
 synchronized(this)
{
           try {    

        Thread.sleep(1000);
        b.setText(gettime());
  }
catch (InterruptedException e)
   {     System.err.println(e);
}     
}
 

 }
  
  public void nao()
{if ((Integer.parseInt(t3)==gc.get(GregorianCalendar.HOUR_OF_DAY))&&(Integer.parseInt(t4)==gc.get(GregorianCalendar.MINUTE)))
{     try{
  this.wait();}   catch (InterruptedException e)
   {     System.err.println(e);
}                this.notify();
}
else { try
{
nn.wait();
}
 catch (InterruptedException e)
   {     System.err.println(e);
}     
nn.notify();
           
}
}

  public String gettime()
{     GregorianCalendar gc=new GregorianCalendar();
      
     return 
    gc.get(GregorianCalendar.HOUR_OF_DAY)+":"+
    gc.get(GregorianCalendar.MINUTE)+":"+
    gc.get(GregorianCalendar.SECOND);
 
  
}
public class no implements Runnable
{        public void run()
{      while (true)
{   
synchronized(this){try
   {    Thread.sleep(1000);
     b.setForeground(Color.green);
 b.setBackground(Color.white);
  b.setText(gettime());
  Thread.sleep(1000);
  b.setText(gettime());
  b.setForeground(Color.red);
          b.setBackground(Color.yellow);
   }
   catch (InterruptedException e)
   {     System.err.println(e);
}
}
}
}}
}

解决方案 »

  1.   

    把你的更新界面显示的代码放在SwingInvokeLater中运行,在其中调用组件的repait方法?
      

  2.   

    错误挺多的:
    1) run方法里只把循环放到else里面了,应该把循环放在最外面。2) 你的gc都没有初始化3) 判断时间是否相等的时候,你的gc只是初始化的时候的时间,没有变化。