Wie kriegt Klasse2 die Info, was Klassse1 gerade "macht

Status
Nicht offen für weitere Antworten.

gigi99

Mitglied
Hallo,
in der Klasse1 ("Serviceklasse") wird irgendetwas zeitintensives in einer Schleife gemacht.
In Klasse2 ist die GUI, die u. a. einen Fortschrittsbalken zeigen soll (gemeint ist der Forschritt eines Objekts von Klasse1). Dazu müsste ich wissen, welcher Schleifendurchlauf in dem Objekt der Klasse1 gerade aktuell ist (also an die Variable i in "realtime" herankommen).
Unten ist das Problem kurz skizziert.

Vielen Dank für Tipps


Code:
public class Klasse1() 
{

  public Klasse1()
  {
        for( i=0; i<=10000; i++)
        {
            Thread.sleep(1000);
        }
  }

}


Code:
public class Klasse2()
{ 

   public static void main(String[] args) 
   { 

       Klasse1 k1 = new Klasse1();

       // hier soll eine GUI mit Fortschrittsbalken für k1 stehen

   }

}
 

eliot

Bekanntes Mitglied
A: Entweder über Listener,
B: oder du prüfst in KlasseB in einem eigenen Thread ab,
welchen Wert i gerade hat (Polling).
Vorzuzihen ist Lösung A.

regards
eliot
 

ARadauer

Top Contributor
Klasse2 wird einfach eine Referenz auf Klasse1 mitgegeben.
Kalsse2 ruft dann eine Methode von Klasse1 auf.

Die Methode wird am besten über ein Interface definiert, dass Klasse 1 implementiert.

Es muss auch nicht eine Klasse sein, Klasse2 kann eine ArrayList von Klassen haben, die das Interface implementiert und wenn was wichtiges passiert, wird von allen die Methode aufgerufen.

oder kurz -> Listener bzw Observer
 
L

lohr

Gast
Code:
public class Klasse1() 
{ 

  private int i;

  public Klasse1() 
  { 
        for( i=0; i<=10000; i++) 
        { 
            Thread.sleep(1000); 
        } 
  }

  public int getSchleifendurchlauf()
  {
      return i;
  }
}

public class Klasse2() 
{ 

  private Klasse1 k;

  public Klasse2(Klasse1 k)
  {
      this.k = k;
  }

  public int getFortschritt()
  {
    return k.getSchleifendurchlauf();
  }


   public static void main(String[] args) 
   { 

       Klasse1 k1 = new Klasse1(); 
       Klasse2 k2 = new Klasse2(k1);
       k2.getFortschritt();
       // hier soll eine GUI mit Fortschrittsbalken für k1 stehen 

   } 
}

Hoffe ich hab das Problem richtig verstanden...
 

Der Müde Joe

Top Contributor
oder halt sowas:
Code:
import java.util.Observable;
import java.util.Observer;

public class MiniObserver {

	static class Value implements Observer {

		@Override
		public void update(Observable arg0, Object arg1) {
			System.out.println(arg0.getClass() + " has Changed Value: " + arg1);
		}		
	}
	
	static class Getter extends Observable {	
		String s = "bla";
		
		void setS(String s){
			this.s = s;
			setChanged();
			notifyObservers(s);
		}	
	}
		
	public static void main(String[] args) {
		Getter g = new Getter();
		Value v = new Value();
		Value v2 = new Value();
		
		g.addObserver(v);
		g.addObserver(v2);
		
		g.setS("test");
		g.setS("new Value");
		
		g.deleteObserver(v);
		
		g.setS("blabla");
	}
}
 

ARadauer

Top Contributor
@lohr: sorry hab die klassen namen vertauscht,
umgekehrt, die gui wird informiert

btw: wenn du einen progessbar machen möchtest, nimm doch einen progess bar java.sun.com/docs/books/tutorial/uiswing/components/progress.html
 

ARadauer

Top Contributor
mal ein beispiel wie ich meine mvc dinge immer aufbaue. wobei mir mal wer gesagt hat, das es kein mvc ist sondern mehr ein mvp weil mein controller eigentlich zu wenig zu tun hat. aber das is mir egal, hab das schon zig mal so eingesetzt und das geht super und lässt sich gut warten.

Code:
public class Controller {
	
	public static void main(String[] args) {
		View v = new View();
		Model m = new Model();
		m.addListener(v);
		m.machWas();	
	}

}

public interface ModelListener {
	
	public void modelChanged(int wert);

}

import java.util.ArrayList;

public class Model {
	ArrayList<ModelListener> listener;
	
	private int i;
	
	
	public Model(){
		listener = new ArrayList<ModelListener>();
	}
	
	public void machWas(){
		for(i = 0; i < 100; i++){
			System.out.println("Model: "+i);
			inform();
		}
	}
	
	public void inform(){
		for(ModelListener l : listener)
			l.modelChanged(i);
	}
	
	public void addListener(ModelListener l){
		listener.add(l);
	}

}

public class View implements ModelListener{
	
	
	public void modelChanged(int wert) {
		//machmal hat meine view auch eine referenz auf
		//das model und hohlt sich die werte
		System.out.println("View: "+wert);
		
	}

}

so ungefähr....
 

gigi99

Mitglied
Diese Lösung habe ich umgesetzt (basierend auf den Infos von euch - Danke) :

Java:
public class Controller
{
    public static void main( String[] args ) throws InterruptedException
    {
        // create 'model' and 'view'
        Model model = new Model();
        View view = new View();
        
        // 'view' listens now
        model.addListener( view );
        
        // 'model' starts working
        model.doSomething();
    }
}

Java:
public class Model
{
    private View view;
    
    public void addListener( View view )
    {
        this.view = view;
    }
    
    public void doSomething() throws InterruptedException
    {
        final long time = System.currentTimeMillis();
        
        // print current timestamp
        System.out.println( "model: " + time ); 
        
        // inform 'view' that model has changed
        view.modelChanged( time );
    }
}

Java:
public class View
{
    public void modelChanged( long changeValue ) throws InterruptedException
    {
        // delay
        Thread.sleep( 1000 );
        
        // output
        System.out.println( "view:  " + changeValue  );
    }
}
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben