Обновите метку апплета Java, используя потоки - PullRequest
2 голосов
/ 11 декабря 2011

У меня есть следующий класс апплетов:

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 (). Прямо сейчас все, что делает метод прокрутки, это возвращает строку, содержащуюся в объекте. Метод run () этого класса выглядит следующим образом:

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

Проблема в том, что когда я запускаю апплет, если я вызываю метод .run (), тогда метка на выделенном поле никогда не отображается. Я попытался repaint (), просто label.setText (), updateUI () и redraw (), чтобы попытаться заставить апплет отобразить обновления, но это не сработало.

Любые предложения будут с благодарностью.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 12 декабря 2011

Вы не создаете новый Thread для запуска scrollObj. Когда вы звоните scrollObj.run() в Marquee.init(), scrollObj захватывает поток вашего апплета. Это означает, что ваш основной Marquee цикл обновления, который включает paint(), никогда не достигается. Вызов repaint() также не гарантирует, что paint() вызван. Таким образом, ваш Marquee никогда не окрашивается.

Ваш код работает нормально при замене scrollObj.run(); на

new Thread(scrollObj).start();
3 голосов
/ 11 декабря 2011

Вы не вызываете run() потока или Runnable. Вы вызываете start() в потоке или в потоке, который содержит Runnable. Кроме того, вам нужно будет позаботиться об обновлении компонентов графического интерфейса в потоке графического интерфейса. Для Swing это означает использование SwingUtilities.invokeLater(someRunnable), и я подозреваю, что это можно сделать аналогично с AWT.

Кстати, а зачем использовать AWT, а не Swing?

1 голос
/ 09 февраля 2014

пример выделения в апплете для потока, например, перемещение чего-либо

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