使用线程更新Java小程序标签

使用线程更新Java小程序标签,java,multithreading,applet,runnable,marquee,Java,Multithreading,Applet,Runnable,Marquee,我有以下小程序类: public class Marquee extends Applet { Label label1 = new Label("Testing"); public void pushUpdate( String text ) { System.out.println( "receiving: " + text ); label1.setText( text ); repaint(); } pu

我有以下小程序类:

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方法所做的就是返回对象包含的字符串。此类的run()方法如下所示:

while(true) {
    try {
        marquee.pushUpdate( scroll() );
        Thread.sleep( 2000 );
    }
    catch (InterruptedException e) {}
}
问题是,当我运行小程序时,如果调用.run()方法,则字幕上的标签永远不会显示。我尝试了repaint()、label.setText()、updateUI()和redraw()来让小程序显示更新,但没有成功

如有任何建议,将不胜感激

谢谢大家!

您不调用线程或Runnable的
run()
。您可以对线程或包含Runnable的线程调用
start()
。此外,您还需要注意更新GUI线程上的GUI组件。对于Swing,这意味着使用
SwingUtilities.invokeLater(someRunnable)
,我怀疑AWT也可以这样做


顺便问一下,为什么使用AWT而不使用Swing?

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

替换
scrollObj.run()时,代码工作正常带有

new Thread(scrollObj).start();

小程序中的选框示例,用于移动类似线程的内容

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);
    }
  }
}
import java.applet.*;
导入java.awt.*;
/***/
公共类选框扩展小程序实现可运行{
颜色clr[]={Color.red,Color.green,Color.cyan,Color.blue,Color.orange};
int xx=0;
int x=100;
INTA=200;
螺纹t=新螺纹(此);
公开作废开始(){
t、 start();
}
公共空间涂料(图g){
g、 setFont(新字体(“Times new Roman”,Font.BOLD,28));
xx++;
如果(xx==3){
xx=0;
}
g、 setColor(clr[xx]);
g、 圆形(200200,x,a);
g、 抽绳(“Vinay”,x,200);
g、 抽绳(“Mayur”,a,300);
x+=1;
a-=1;
}
公开募捐{
试一试{
系统输出打印项次(“sdd”);
对于(int i=0;i<200;i++){
睡眠(10);
重新油漆();
}
}捕获(例外e){
System.out.println(“错误:-->”+e);
}
}
}

控制台是否打印“接收:…”命令?如果没有,问题可能是您在
线程更新UI之前将其置于睡眠状态。尝试删除
线程。在这种情况下,sleep(2000)
。是的,接收的println会打印出来,UI似乎不会更新。您是否尝试删除
线程。sleep
无论如何?1)要更快地获得更好的帮助,请发布一个。2) 正如via HFOE的问题所暗示的,在这个千年中使用Swing,而不是AWT。3) 有一些简单的方法可以通过调用
repaint()
的Swing来实现这一点。在阅读了气垫船的答案后,我意识到调用
EventQueue.invokeLater(scrollObj)
更合适。这将在
scrollObj
启动之前设置小程序的GUI。不,你是对的。他应该在上面保存Runnable的线程上调用
start()
,但是在上面的代码内部,原始海报应该放置
marquee.pushUpdate(scroll())调用Runnable,然后使用
调用器(…)
在事件线程上对Runnable进行排队。向上投票并感谢。+1感谢您考虑
invokeLater
。多线程处理可能是完全不可靠的。