Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich programmiere gerade an einer Projektarbeit und da bin ich auf ein grundlegendes Problem gestoßen.
Wie kann mein Hauptprogramm auf z.B. 2 Integerwerte meines laufenden Threads "zugreifen"?
Das heisst, ich will z.B. in einem Thread, die Koordinatenwerte für ein Rechteck, das in meiner MainClass durch die Paint-Methode gezeichnet wird, ausrechnen. Wie komme ich an diese Werte heran?
Habe schon etwas über Callable gelesen, gibt nicht aber vieleicht eine schlauere Methode so etwas zu lösen?
Ja also erstmal würde ich gerne, ganz generell wissen, wie man vorgeht, wenn man einen Wert aus Threads haben will. Vieleicht kann ich ja eine Rückgabe allgemein umgehen.
Wenn du auf deine Threads zugreifen willst dann brauchst du ne Referenz und kannst darauf dann getter aufrufen. Callables sind Tasks mit Rückgabewerten. Die laufen ne Zeit lang und geben dir dann nen Ergebniss zurück.
So hier mal mein reduzierter Code.
Ergibt noch keinen Sinn, aber als Beispiel reicht's erstmal.
Wie komme ich jetzt hier an die werte von x und y aus dem Thread "move"?
Java:
import java.awt.*;
import java.awt.event.*;
public class Example1Applet extends java.applet.Applet implements Runnable {
Thread animator;
Thread move=new Thread(new MoveShape());
int x=100;
int y=100;
public void init() {
setSize(1200,600);
}
public void start() {
animator = new Thread(this);
animator.start();
move.start();
}
public void run() {
while (Thread.currentThread() == animator) {
repaint();
}
}
public void stop() {
animator = null;
}
public void paint(Graphics g) {
g.setColor(Color.black);
g.fillRoundRect(x, y, 15, 15, 15, 15);
}
}
Java:
public class MoveShape implements Runnable {
public int x=0;
public int y=0;
@Override
public void run() {
// TODO Auto-generated method stub
try{
Thread.sleep(200);
x++;
y++;
}catch(InterruptedException e){}
}
}
Um das Try-Catch in deiner MoveShape Klasse müsstest du noch einen Schleife machen, damit wiederholt die Variablen inkrementiert werden. So läuft die run() Methode einmal durch, und dann ist der Thread auch schon fertig.
Java:
public class MoveShape implements Runnable {
private int x=0;
private int y=0;
private boolean running = false;
@Override
public void run() {
running = true;
while(running) {
try{
Thread.sleep(200);
x++;
y++;
}catch(InterruptedException e){}
}
}
public int getX(){ return x; }
public int getY(){ return y; }
public void stopRunning(){ this.running=false; }
}
Zusätzlich hat die Klasse noch eine Methode zum Beenden der While-Schleife. Über die beiden Getter-Methoden bekommst du die aktuellen Werte der beiden Variablen. Die Werte ändern sich aber in der Klasse weiterhin, das bekommst du aber nach dem Getter-Aufruf nicht mehr mit.
So sehr viel haben meine Ausführungen aber nicht mehr mit deinem Problem und deinem Code zu tun, merke ich gerade. Du könntest den MoveShape Thread als innere Klasse in der Applet-Klasse realisieren, so dass MoveShape Zugriff auf x und y hat. Die beiden Variablen wären dann nur in der Applet Klasse definiert. Dann müsste die Applet-Klasse auch nicht Runnable implementieren.
Vielleicht besser als die Werte aus dem Thread zu holen, wäre diese aus dem Thread heraus im "Eigentümer" der Variablen zu ändern. Schießlich muss ja auf der darstellenden Komponente auch noch repaint() aufgerufen werden. (Die Dauerschleife ist mehr als unschön).
Noch besser wäre die Werte in einem Objekt zu kapseln.
Nochmal eine vieleicht blöde Frage, die Werte in einem Objekt zu kapseln, heisst in einer neuen Datei eine neue Klasse mit 2 int Attributen zu erstellen oder ?
Ja genau MartyMcFly.
Werte in ein Object kapseln ist eine neue Klasse mit den Werten zu erstellen
Java:
public class Coordinate {
private int x;
private int y;
public Coordinate(in pX, int pY) {
x=pX;
y=pY;
}
public int getX() { return x;}
public int getY() { return y;}
public void increaseX() { x++;}
public void decreaseX() { x--;}
public void increaseY() { y++;}
public void decreaseY() { y--;}
}