Hallo,
ich hab hier ein Tool, das aus Client und Server besteht: Der Server errechnet aus den vom Client gesendeten Parametern die Mandelbrotmenge und gibt sie in einem int[][] zurück. Der Client stellt das Ergebnis dann in einem Canvas dar.
Nun soll der Client die Anfrage auf mehrere Server aufteilen und die Teilergebnisse zu einem ganzen Bild zusammensetzen. Wenn ich die Bilder von jedem Server einzeln anzeigen lassen klappt alles, aber wenn ich alle zugleich anzeigen lassen will, zeigt er nur das erste und letzte Teilstück an (der Rest scheint irgendwovon überdeckt zu sein)
Was mache ich falsch? Was überdeckt da? Wo sind die anderen Teile hin? Wieso diese "Darstellungsfehler"?
(Grad ist mir auch noch aufgefallen, dass die y-Koordinate vom ersten Teilbild im Gesamtbild verschoben ist, obwohl daran nix geändert wurde)
Dort sind Beispielbilder und der gesamte Quellcode zu finden: *klick*
Hier die meiner Meinung nach relevanten Auszüge:
Vielen Dank an die, die bis hierher noch durchgehalten haben
ich hab hier ein Tool, das aus Client und Server besteht: Der Server errechnet aus den vom Client gesendeten Parametern die Mandelbrotmenge und gibt sie in einem int[][] zurück. Der Client stellt das Ergebnis dann in einem Canvas dar.
Nun soll der Client die Anfrage auf mehrere Server aufteilen und die Teilergebnisse zu einem ganzen Bild zusammensetzen. Wenn ich die Bilder von jedem Server einzeln anzeigen lassen klappt alles, aber wenn ich alle zugleich anzeigen lassen will, zeigt er nur das erste und letzte Teilstück an (der Rest scheint irgendwovon überdeckt zu sein)
Was mache ich falsch? Was überdeckt da? Wo sind die anderen Teile hin? Wieso diese "Darstellungsfehler"?
(Grad ist mir auch noch aufgefallen, dass die y-Koordinate vom ersten Teilbild im Gesamtbild verschoben ist, obwohl daran nix geändert wurde)
Dort sind Beispielbilder und der gesamte Quellcode zu finden: *klick*
Hier die meiner Meinung nach relevanten Auszüge:
Code:
public static void main(String[] args) {
[...]
Client client = new Client();
for(int i=0; i<anzahlServer; i++) {
// verfuegbare Serverdaten auslesen und im Client verwenden
FraktaleServer fs = current.get(i);
client.setParameter(fs.getBreite(), fs.getLaenge(), fs.getX1(), fs.getY1(), fs.getX2(), fs.getY2(), fs.getIteration(), fs.getFarbe(), fs.getModul());
client.server = fs.getAddress().getHostName();
client.port = fs.getAddress().getPort();
// Immer wieder pruefen, ob Serverberechnung fertig und Port wieder offen ist (oder Timedout)
client.serverErreichbar();
// Canvas-Hintergund jedesmal veraendern zur Unterscheidung der Teilbilder
Color bg = new Color((i+1)*1234567890);
client.setBgColor(bg);
// Teilbild empfangen
int[][] array = client.empfangen(fs.getStartX(), fs.getStartY());
// Teilbild in eigenem Canvas darstellen und richtig positionieren
client.anzeigen(fs.getStartX(), fs.getStartY(), array);
}
// Mandelbrotmenge anzeigen
client.setVisible(true);
}
Code:
class Client() {
[..]
public void anzeigen(int startX, int startY, int[][] array) {
// Zeichenflaeche erstellen
MyCanvas canvas = new MyCanvas();
// Hintergrundfarbe setzen
canvas.setBackground(bgFarbe);
// Position und Groesse anpassen
canvas.setBounds(startX, startY, frameBreite/serverAnzahl, frameLaenge);
// Varbiale an Zeichenflaeche uebergeben
canvas.breite = breite;
canvas.laenge = laenge;
canvas.startX = startX;
canvas.startY = startY;
canvas.array = array;
// Zeichenflaeche dem Fenster hinzufuegen
frame.add(canvas);
}
}
Code:
class MyCanvas extends Canvas {
static final long serialVersionUID = 0; // erforderlich um Warning (Eclipse) zu eliminieren
int[][] array;
int breite;
int laenge;
int startX;
int startY;
// Funktion wird automatisch von Java gerufen,
// wenn das Fenster angezeigt wird und sich die Zeichenflaeche darstellen soll
public void paint(Graphics g) {
// Vordergrundfarbe setzen
g.setColor(Color.black);
// Pixelgrafik aus Array auf der Zeichenflaeche ausgeben
for(int x=0; x<breite; x++) {
for(int y=0; y<laenge; y++) {
// Farbwert des Bildpunkts auslesen
int tmp = array[x][y];
// 0=Hintergrund, sonst Pixel malen
if(tmp > 0) {
// setzt Pixel auf die Zeichenflaeche
g.drawRect(startX+x,startY+y,0,0);
}
}
}
}
}
Vielen Dank an die, die bis hierher noch durchgehalten haben