使用Threads更新Java Applet标签

时间:2011-12-11 18:05:08

标签: java multithreading applet runnable marquee

我有以下Applet类:

public class Marquee extends Applet {
    Label label1 = new Label("Testing");

    public void pushUpdate( String text ) {
        System.out.println( "receiving: " + text );
        label1.setText( text );
        repaint();
    }

    public void init() {
        ScrollText_2 scrollObj = new ScrollText_2( "Applet test" );
        scrollObj.setApplet(this);
        add( label1 );
        scrollObj.run();
    }
}

ScrollText2类实现Runnable并具有scroll()方法。现在,所有scroll方法都返回对象包含的String。这个类的run()方法如下所示:

while(true) {
    try {
        marquee.pushUpdate( scroll() );
        Thread.sleep( 2000 );
    }
    catch (InterruptedException e) {}
}

问题在于,当我运行applet时,如果我调用.run()方法,那么选取框上的标签永远不会显示。我已经尝试了repaint(),只是label.setText(),updateUI()和redraw()来尝试让applet显示更新,但它不起作用。

任何建议都将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:3)

您不要调用Thread或Runnable的run()。您在线程或包含Runnable的线程上调用start()。此外,您需要注意更新GUI线程上的GUI组件。对于Swing,这意味着使用SwingUtilities.invokeLater(someRunnable),我怀疑它可以与AWT类似地完成。

顺便说一下,为什么要使用AWT而不是Swing?

答案 1 :(得分:3)

您没有创建新的Thread来运行scrollObj。当您在scrollObj.run()中致电Marquee.init()时,scrollObj会劫持您的小程序线程。这意味着永远不会到达包含Marquee的主paint()更新循环。调用repaint()也不能保证调用paint()。因此,您的Marquee永远不会被绘制。

使用

替换scrollObj.run();时,您的代码可以正常工作
new Thread(scrollObj).start();

答案 2 :(得分:1)

在applet中的例子,用于移动东西的线程

import java.applet.*;
import java.awt.*;
/**<applet code="Marquee" height=768 width=1024></applet>*/
public class Marquee extends Applet implements Runnable {
  Color clr[] = { Color.red, Color.green, Color.cyan, Color.blue, Color.orange };
  int xx = 0;
  int x = 100;
  int a = 200;
  Thread t = new Thread(this);

  public void start() {
    t.start();
  }

  public void paint(Graphics g) {
    g.setFont(new Font("Times New Roman", Font.BOLD, 28));
    xx++;
    if (xx == 3) {
      xx = 0;
    }
    g.setColor(clr[xx]);
    g.fillOval(200, 200, x, a);
    g.drawString("Vinay", x, 200);
    g.drawString("Mayur", a, 300);
    x += 1;
    a -= 1;
  }

  public void run() {
    try {
      System.out.println("sdd");
      for (int i = 0; i < 200; i++) {
        Thread.sleep(10);
        repaint();
      }
    } catch (Exception e) {
      System.out.println("Error:-->" + e);
    }
  }
}