# Int-Wert aktualisieren?



## Tweaker (20. Nov 2013)

Hallo,

ich habe wieder ein Problem, wo ich keine Lösung finde. 

Ich habe Int-Werte in einem Textfield gespeichert, diese Werte verändern sich alle 5 Sekunden. Jetzt will ich das diese neuen Werte dann anstelle der alten Werte angezeigt werden. 
Funktioniert ja dadurch das die GUI neu gezeichnet wird, bzw. dieser eine Bereich, also glaube ich zumindest. 

Was ich aus dem Internet habe ist das es in einem eigenen Thread laufen muss, ist ja logisch, dachte ich mir vorher schon.

Hab auch ein paar Schnippsel aus dem Internet. Aber irgendwie geht das nicht so

dann hab ich da was zusammen gebastelt

```
Thread t = new Thread(new Runnable()
	{
	    public void run()
	    {
	        
	        SwingUtilities.invokeLater(new Runnable()
	        {
	            @Override
	            public void run()
	            {
	            	bspField.setText ( Integer.toString(bspInt) );
	            }
	        });
	    }
	});
```

Edit: Könnte man das verschieben in den GUI Bereich, das kommt davon wenn man mehrere Dinge gleichzeitig tut


----------



## Attila (20. Nov 2013)

```
public class GUIClass extends JFrame{
   //...
   public static void main(String[] args) {
     SwingUtilities.invokeLater(new Runnable() {
       public void run() {
         new GUIClass();
       }
     });
  }
}
```


```
final JTextField textField = new JTextField();
//...
Thread t = new Thread(new Runnable(){
  private int num = 0;
  public void run(){
    while ( ! isInterrupted() ) {
      try {
        num++;
        SwingUtilities.invokeLater(
          new Runnable() {
            @Override
            public void run() {
              textField.setText(""+num);
            }
          }
        );
        Thread.sleep( 5000 );
      } catch ( InterruptedException e ){
         interrupt();
      }
    }
  }
});
t.start();
```


----------



## Tweaker (20. Nov 2013)

hmm, danke für die Antwort hast auch ein Danke verdient, aber das scheint bei mir noch nicht so zu klappen.

Das Verändern der Variable wird aus einer anderen Klasse gesteuert.
Diese Klasse heißt:
 Downer 

```
public class Downer {
	protected void downInt() {
		Timer repeat = new Timer();
		TimerTask go = new TimerTask() {
			public void run() {
				Zumtest.setTestInt(Zumtest.getTestInt() - 2);
			}
		};
		repeat.schedule(go, 1000, 10 * 5000);
	}

}
```

Diese geht dann an die "Zumtest.java" also die Klasse in der vorher die Main Methode war weil alles was ich vorher hatte war Textbasiert.

Das Interface also die GUI ist ja in einer eigenen Klasse, kann es vllt. sein, das wenn ich das Interface aufrufe, welches sich zwar die Variablen aus "Zumtest.java" nimmt, der Downer garnicht angesprochen wird? Wenn ja, wo müsste ich den Fehler ausbügeln, hab auch zum Test schon probiert die Klasse Downer zu importieren ect.:bloed:


----------



## Attila (20. Nov 2013)

Wie sieht die Klasse Zumtest.java aus?


----------



## Tweaker (20. Nov 2013)

Die Klasse hat viele Zeilen, ich werde einfach mal all das was eine Rolle spielt und mit denen Variablen bzw. Methoden zusammen hängt hier zusammen fügen.


```
public class Zumtest {
	Downer down = new Downer();
	int testInt;
	
	public static int getTestInt() {
		return testInt;
	}

	public static void setTestInt(int testInt) {
		Zumtest.testInt = testInt;
	}
	public void status(); {
		// Hier steht ne Zeichenfolge mit der ich den Status der Variable abrufen konnte!
	}

	public static void main(String[] args) {
		Zumtest zumtest = new Zumtest();	
		down.downHunger();
		zumtest.status();

	}

}
```

Alle anderen Methoden haben nichts damit zutun und/oder stehen für andere Sachen. So ist es übersichtlicher. Allgemein habe ich eben mehrere Klassen die eben zu der Zurtest.java gehen weil dies meine Main klassen ist/war


----------



## Attila (20. Nov 2013)

Was für eine Aufgabe hat die Funktion status()?


----------



## Tweaker (20. Nov 2013)

Also, in der Zumtest hat Status die Aufgabe alle Variablen auszugeben, ich habe 4 davon. wenn ich dies aufrufe geht der Int wert auch runter in den Variablen. Sprich durch Status konnte/kann ich sehen wie weit die Variablen runter sind.

Was in der GUI ja dann überflüssig wäre


----------



## Attila (20. Nov 2013)

ohne GUI:

```
public class Zumtest {
  private int testInt = 0;
  public Zumtest(){
    Downer down = new Downer(this);
    down.downInt();
  }

  public synchronized int getTestInt() {
     return testInt;
  }

  public synchronized void setTestInt(int testInt) {
      this.testInt = testInt;
  }

  public void status(){};

  public static void main(String[] args) {
    new Zumtest();
  }
}
```


```
public class Downer {
  private Zumtest zumtest;
  public Downer(Zumtest zumtest){
    this.zumtest = zumtest;
  }

  public void downInt() {
    Timer repeat = new Timer();
    TimerTask go = new TimerTask() {
      @Override
      public void run() {
         zumtest.setTestInt(zumtest.getTestInt() - 2);
      }
    };
    repeat.schedule(go, 1000, 5000);
  }
}
```


----------



## Tweaker (20. Nov 2013)

Auch ein Danke hierfür!

Aber das mit der GUI klappt immer noch nicht, es geht ja darum das es in der GUI klappen soll. In der Konsole normal funktioniert es ja jedes mal wenn ich den Status abrufe, war ja genau das was ich wollte.

Muss ich die Down methode in meiner GUI.java implementieren und dort ausführen?
Oder gar die Zumtest.java in die GUI.java irgendwie?

Oder soll ich die Zumtest.java und die GUI.java zusammen führen?
Was aber unübersichtlich wäre


----------



## Attila (20. Nov 2013)

```
public class Zumtest extends JFrame{
  private int testInt = 0;
  private JLabel label;
  public Zumtest(){
    setLayout(new FlowLayout());
      
    label = new JLabel("0");
    add(label);
    
    Downer down = new Downer(this);
    down.downInt();

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationByPlatform(true);
    setSize(150,150);
    setVisible(true);            
  }

  public synchronized int getTestInt() {
     return testInt;
  }

  public synchronized void setTestInt(int testInt) {
      this.testInt = testInt;
  }
  
  public void dispLabel(){
      label.setText(""+getTestInt());
  }

  public void status(){};

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Zumtest();
        }
    });
  }
}
```


```
public class Downer {
  private Zumtest zumtest;
  public Downer(Zumtest zumtest){
    this.zumtest = zumtest;
  }

  public void downInt() {
    Timer repeat = new Timer();
    TimerTask go = new TimerTask() {
      @Override
      public void run() {
         zumtest.setTestInt(zumtest.getTestInt() - 2);
         SwingUtilities.invokeLater(
            new Runnable() {
               @Override
               public void run() {
                   zumtest.dispLabel();
               }
            }
         );
      }
    };
    repeat.schedule(go, 1000, 500);
  }
}
```


----------

