paintComponent(Graphics) i SWING component
Hej eksperter,Jeg sad lige og kiggede på JavaBeans og for lige at få styr på hvordan det virker så ville jeg lige lave et forsøg. Så jeg gik i gang med at konvertere en applet jeg lavede tidligere i år, om til en JavaBean. Det gik sådan set fint nok og Forte lod mig tilføje den til min Component Palette.
Nu tilføjede jeg den så til en jForm og forventede at der ligesom blev tegnet noget... men nej, ikke en gang baggrundsfarven blev tegnet, heller ikke når jeg kører programmet :-(
Hvad dælen gør jeg galt?
På forhånd tak, gnuen.
min paintComponent metode:
public void paintComponent(Graphics gr) {
if ((dBuffer == null) || (dBuffer.getWidth(this) != this.getWidth()) || (dBuffer.getHeight(this) != this.getHeight()))
dBuffer = this.createImage(this.getWidth(), this.getHeight());
Graphics g = dBuffer.getGraphics();
g.clearRect(0, 0, dBuffer.getWidth(this), dBuffer.getHeight(this));
g.setColor(getForeground());
//Lav en matrix der flytte punkterne fra objektsystemet til skærmsystemet
Matrix3D tilSkaerm = new Matrix3D();
//Objektsystemet parallelforskydes, så origo falder sammen med sigtepunktet
tilSkaerm.parallelforskyd(sigtePunkt[0], sigtePunkt[1], sigtePunkt[2]);
//Objektsystemet roteres om x-aksen, så øjepunktet kommer til at ligge i xz-planen
//theta = -tan-1(øjeY/øjeZ)
tilSkaerm.roter(-Math.atan(oejePunkt[1]/oejePunkt[2]), Matrix3D.X_AKSE);
//Objektsystemet roteres om y-aksen, så øjepunktet kommer til at ligge på z-aksen
//theta = tan-1(øjeX/sqrt(øjeY^2+øjeZ2))
tilSkaerm.roter(Math.atan(oejePunkt[0]/Math.sqrt(oejePunkt[1]*oejePunkt[1]+oejePunkt[2]*oejePunkt[2])), Matrix3D.Y_AKSE);
//Skærmens y-akse vender nedaf, svarende til en rotation på pi radianer om x-aksen
tilSkaerm.roter(Math.PI, Matrix3D.X_AKSE);
//Forskyd alle punkter til midten af skærmen
tilSkaerm.parallelforskyd(this.getWidth()/2, -this.getHeight()/2, 0);
//Tegn evt. akserne
if (visAkser && (akser != null)) {
//Hent punkter
double[][] aksePunkter = tilSkaerm.transformerPunkter(akser.Punkter);
//tegn
for (int i=0 ; i<akser.Linjer.length ; i++)
g.drawLine((int) (aksePunkter[akser.Linjer[i][0]-1][0]),(int) (aksePunkter[akser.Linjer[i][0]-1][1]),(int) (aksePunkter[akser.Linjer[i][1]-1][0]),(int) (aksePunkter[akser.Linjer[i][1]-1][1]));
//skriv navn på akserne
g.drawString(\"x\",(int) aksePunkter[1][0], (int) aksePunkter[1][1]);
g.drawString(\"y\",(int) aksePunkter[15][0], (int) aksePunkter[15][1]);
g.drawString(\"z\",(int) aksePunkter[29][0], (int) aksePunkter[29][1]);
}
//Tegn modellen, forudsat den findes
if (model != null) {
//Flyt modellens punkter fra objektsystemet til skærmen
double[][] punkter = Matrix3D.multiplicer(tilSkaerm, model.mat).transformerPunkter(model.Punkter);
//Tegn linjer
for (int i=0 ; i<model.Linjer.length ; i++)
g.drawLine((int) (punkter[model.Linjer[i][0]-1][0]),(int) (punkter[model.Linjer[i][0]-1][1]),(int) (punkter[model.Linjer[i][1]-1][0]),(int) (punkter[model.Linjer[i][1]-1][1]));
//Tegn evt. labels
if (visLabels) {
//Hent koordinaterne i objektsystemet
double[][] labelPunkter = model.mat.transformerPunkter(model.Punkter);
for (int i=0 ; i<punkter.length ; i++)
g.drawString(\"(\"+(int)labelPunkter[i][0]+\",\"+(int)labelPunkter[i][1]+\",\"+(int)labelPunkter[i][2]+\")\",(int) punkter[i][0],(int) punkter[i][1]);
}
}
gr.drawImage(dBuffer, 0 , 0, this);
}
public double[] getOejePunkt() {
return oejePunkt;
}
