2011-12-11 23 views
2

我有以下的Applet类:更新Java小程序使用标签线程

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,并有一个滚动()方法。现在,所有的滚动方法都会返回该对象包含的字符串。这个类的run()方法是这样的:

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

的问题是,当我运行小程序,如果我调用.RUN()方法,然后在字幕标签永远不会显示。我尝试了repaint(),只是label.setText(),updateUI()和redraw()尝试让applet显示更新,但没有奏效。

任何建议将不胜感激。

谢谢!

+0

确实

你的代码工作正常“接收:...”打印从控制台?如果没有,那么问题可能是您在将线程置于睡眠状态之前可以更新UI。在这种情况下,尝试删除'Thread.sleep(2000)'。 – Jon

+0

是的,接收println打印出来,UI似乎并没有更新。 –

+0

您是否尝试去除'Thread.sleep'? – Jon

回答

3

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

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

+0

用于考虑'invokeLater'。多线程可以是彻头彻尾的。 –

3

您并未创建新的Thread以运行scrollObj。当您在Marquee.init()中拨打scrollObj.run()时,scrollObj劫持您的小程序线程。这意味着您的主要Marquee更新循环,其中包括paint(),永远不会到达。调用repaint()也不保证调用paint()。因此,您的Marquee从不画。当你在小程序

new Thread(scrollObj).start(); 
+0

在阅读Hovercraft的答案之后,我意识到,改为调用'EventQueue.invokeLater(scrollObj)'会更合适 - 这会在'scrollObj'启动之前设置您的applet的GUI。 –

+1

不,你说得对。他应该在上面包含Runnable的线程上调用'start()',但在上面的代码中,原始的海报应该将'marquee.pushUpdate(scroll())'调用放入Runnable中,然后将使用'invokeLater(...)'在事件线程上运行。赞成并感谢。 –

1

选取框例如更换scrollObj.run();线程像移动的东西

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