2016-11-05 5 views
1

Ich versuche, ein einfaches Applet mit Java zu machen, um zwei Zähler anzuzeigen. Um den Code zu vereinfachen, habe ich eine Funktion namens "suma" erstellt, die in run() 2 mal aufgerufen wird. Die Zähler in der Konsole funktionieren, aber im Applet werden nicht erhöht. Ich denke, das Problem ist in Repaint(), weil, wenn ich versuche, den Inhalt von "Suma" in ausführen, direkt der Code funktioniert. Die Frage ist: Warum repaint() funktioniert nicht aus run()?Repaint() funktioniert nicht aus run() Funktion

import java.applet.Applet; 
import java.awt.Button; 
import java.awt.Color; 
import java.awt.Graphics; 


public class HiloContador extends Applet implements Runnable{ 
    //Propiedades 
    private Thread h1; 
    private Thread h2; 
    long contador1=0; 
    long contador2=500; 
    private Button b1,b2; 

    public void start(){} 

    public void init(){ 
     setBackground(Color.YELLOW); 
     //Botones 
     add(b1=new Button("Parar hilo 1")); 
     add(b2=new Button("Parar hilo 2")); 
     //Creación de nuevos hilos y su inicio 
     h1=new Thread(this); 
     h2=new Thread(this); 
     h1.start(); 
     h2.start(); 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     suma(h1,contador1); 
     suma(h2,contador2);  
    }//fin de run 

    public void paint(Graphics g){ 
     g.drawString(Long.toString((long)contador1), 80, 100); 
     g.drawString(Long.toString((long)contador2), 80, 120); 
    } 

    public void suma(Thread h,long c){ 
     Thread hiloActual=Thread.currentThread(); 
     while(h==hiloActual){ 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println(c); 
      c++; 
      repaint(); 
     }//fin de while  
    } 
} 

enter image description here

+0

Dank. Ich ändere die Suma-Funktion. Aber ich weiß nicht, wie AtomicLong in. DrawString verwenden kann. g.drawString (Long.toString ((lang) contador1), 80, 100); Wie kann ich AtomicLong zu String für drawString() analysieren? Gelöst mit: g.drawString (contador1.toString(), 80, 100); –

+0

Soll dieser Kommentar an Nicolas Filotto gerichtet sein? Wenn ja, kommentiere die Antwort, nicht die Frage! –

Antwort

1

Dies liegt daran, wenn Sie eine primitive Art wie ein long ein Verfahren zur Verfügung stellen, Sie seinen Wert nicht seine Referenz zu übergeben, so dass, wenn Sie c in Ihrer Methode erhöhen suma Sie don‘ t ändern Sie den Wert Ihrer Variablen tatsächlich, erhöhen Sie nur den bereitgestellten Wert, verwenden Sie AtomicLong anstelle von long als Parameter Ihrer Methode seit wird es dann durch Verweis übergeben, da es nicht mehr ein primitiver Typ aber ein Objekt ist t Referenz, dann inkrementieren Sie seinen internen Wert mit incrementAndGet() und erhalten Sie es mit get().

Ihr Code wäre dann:

... 
AtomicLong contador1 = new AtomicLong(); 
AtomicLong contador2 = new AtomicLong(500); 
... 

public void paint(Graphics g){ 
    g.drawString(Long.toString(contador1.get()), 80, 100); 
    g.drawString(Long.toString(contador2.get()), 80, 120); 
} 

public void suma(Thread h, AtomicLong c){ 
    ... 
     System.out.println(c); 
     c.incrementAndGet(); 
     repaint(); 
    ... 
} 

Mehr Details über pass-by-reference/pass-by-value

+1

Ja. Es funktioniert für mich, aber ich c.addAndGet (1) statt c.incrementAndGet(). Thaks. –

Verwandte Themen