package aa;
import java.awt.*;
import java.applet.*;
import javax.swing.*;class CBox extends JPanel implements Runnable
{
int x,y;
String Message="java now!";
Font f=new Font("TimesRoman",Font.BOLD,24);
Thread th=null;
public CBox()
{
th=new Thread(this);
th.start();
}
public void run()
{
x=getWidth();
y=getHeight()/2;
while(true)
{
x=x-5;
if(x==0)x=getSize().width;
repaint();
try
{
th.sleep(500);
}
catch(InterruptedException e)
{

}
}//while
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
g2.setFont(f);
g2.drawString(Message, x, y);

}
}public class JavaNow extends Applet{
public void init()
{
Container cp=getContentPane();
CBox pa=new CBox();
pa.setBackground(Color.blue);
cp.add(pa,BorderLayout.CENTER);

}}

解决方案 »

  1.   

    你的两个类在同一个文件中吗?这样是不对的,一个文件中只能有一个类是public 的.
      

  2.   


    Container cp=getContentPane()这句话貌似不对啊!
    但书上是这么写的。我就不明白这个程序是从哪里开始执行的。
      

  3.   

    尽管applet可以有init方法,但是任何类肯定都是首先执行构造函数的。所以这里你可以看作是从构造函数开始的。同时,这个类实现了Runnable方法,按线程的方式运行,调用start方法,将会触发线程执行run方法。去多看看书,把基础打实。
      

  4.   

    getContentPane是你定义的?applet最开始执行的是init方法,其他的start,destory等方法,分别是浏览器装载,关闭等对应的操作。至于CBox pa=new CBox();根据你的类的定义,生成这个pa对象的时候,就已经开始运行线程了。感觉在构造函数里直接运行线程不好。你可以先查看下applet的基础知识,然后学习线程thread的基础知识,两个分别弄清楚,问题就解决了。
      

  5.   

    将Applet改用JApplet就可public class JavaNow extends javax.swing.JApplet{
    public void init()
    {
    Container cp=getContentPane();
    CBox pa=new CBox();
    pa.setBackground(Color.blue);
    cp.add(pa,BorderLayout.CENTER);}}