使用线程更新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
。多线程处理可能是完全不可靠的。