Hallo,
ich habe ein Problem (ohg Wunder...).
In meiner Anwendung existiert ein Formular. Dieses Formular enthält unteranderem ein ImageIcon mit einem BufferedImage form.prevImage.
Nun kann der Benutzer eine Auswahl im Formular treffen und ich möchte abhängig von der Auswahl etwas in das Bild zeichnen. Anschließend soll das Formular neu gezeichnet werden.
Nun noch ein paar Randbemerkungen zu dem unten dargestellten Code:
1.) Wenn das Problem auftritt, tut es das schon bei buildImage sobald drawImage mit voImage aufgerufen wird.
2.) Der Code funktioniert meistens. Nur wenn voImage kleiner als buildImage ist tritt der Fehler auf und auch dann nicht immer.
3.) Der Fehler äussert sich derart:
In dem Bereich der nicht betroffen ist, ist kein grauer Hintergrund zu sehen (wie ich erwarten würde) sondern ein "Geist" Bild. Mit "Geist" Bild meine ich, dass was vorher in prevImage zu sehen war. Allerdings hat buildImage doch nichts mit prevImage zu tun, oder seh ich das falsch?
4.) Dieser Code ist wesentlich reduziert. Einige stellen werden für den geneigten Leser unnütz ausschauen. Ignoriert es einfach. Bevor jemand fragt: Ja das Problem besteht auch bei dieser gekürzten Version.
Es folgt nun der Code-Teil:
[HIGHLIGHT="Java"]
AbstractVO[] sel = form.apGrid.getSelectedVOs();
form.prevImage.flush();
int prevWidth = form.prevImage.getWidth();
int prevHeight = form.prevImage.getHeight();
Graphics2D g = (Graphics2D)form.prevImage.createGraphics(); //hier hole ich mir Graphics-Objekt um ins Bild zu zeichnen.
g.setColor(Color.GRAY);
g.fillRect(0, 0, prevWidth, prevHeight);
int pictureWidth = prevWidth;
int pictureHeight = prevHeight;
double ratioX = 1;
double ratioY = 1;
pictureWidth = (int)(pictureWidth*ratioX);
pictureHeight = (int)(pictureHeight*ratioY);
ArbeitsplatzVO apvo = (ArbeitsplatzVO) sel[0];
if(apvo.vorschau!=null){
try {
ResolutionVO resvo = (ResolutionVO)apvo.getFormDefinitions().getDataTable(ResolutionVO.TABLE_NAME).getVO();
Rectangle recordedRes = resvo.getResolution();
ByteArrayInputStream bais = new ByteArrayInputStream(apvo.vorschau);
BufferedImage voImage = ImageIO.read(bais); //Dies ist ein Vorschaubild
BufferedImage buildImage = new BufferedImage(prevWidth, prevHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D build_g = buildImage.createGraphics();
build_g.setColor(Color.DARK_GRAY);
build_g.fillRect(0, 0, prevWidth, prevHeight);
build_g.setColor(Color.LIGHT_GRAY);
build_g.fillRect(0, 0, device.getDefaultConfiguration().getBounds().width/4, device.getDefaultConfiguration().getBounds().height/4);
if(recordedRes.intersects(device.getDefaultConfiguration().getBounds())){
build_g.drawImage(voImage, 0, 0, device.getDefaultConfiguration().getBounds().width/4, device.getDefaultConfiguration().getBounds().height/4,
(device.getDefaultConfiguration().getBounds().x - recordedRes.x)/4, (device.getDefaultConfiguration().getBounds().y - recordedRes.y)/4,
(device.getDefaultConfiguration().getBounds().x - recordedRes.x + device.getDefaultConfiguration().getBounds().width)/4,
(device.getDefaultConfiguration().getBounds().y - recordedRes.y + device.getDefaultConfiguration().getBounds().height)/4, null);
}
build_g.setColor(Color.BLACK);
build_g.drawRect(-1, -1, (device.getDefaultConfiguration().getBounds().width/4)+1, (device.getDefaultConfiguration().getBounds().height/4)+1);
g.drawImage(buildImage, 0, 0, (int)(buildImage.getWidth()*ratioX), (int)(buildImage.getHeight()*ratioY), null);
} catch (Exception e1) {
e1.printStackTrace();
}
}
form.southPanel.repaint(form.prevSP);
[/HIGHLIGHT]
Vielen Dank im Voraus für eure Mühen.
Ich werde versuchen eine Version zu stricken die man mit copy&paste mal laufen lassen kann.
ich habe ein Problem (ohg Wunder...).
In meiner Anwendung existiert ein Formular. Dieses Formular enthält unteranderem ein ImageIcon mit einem BufferedImage form.prevImage.
Nun kann der Benutzer eine Auswahl im Formular treffen und ich möchte abhängig von der Auswahl etwas in das Bild zeichnen. Anschließend soll das Formular neu gezeichnet werden.
Nun noch ein paar Randbemerkungen zu dem unten dargestellten Code:
1.) Wenn das Problem auftritt, tut es das schon bei buildImage sobald drawImage mit voImage aufgerufen wird.
2.) Der Code funktioniert meistens. Nur wenn voImage kleiner als buildImage ist tritt der Fehler auf und auch dann nicht immer.
3.) Der Fehler äussert sich derart:
In dem Bereich der nicht betroffen ist, ist kein grauer Hintergrund zu sehen (wie ich erwarten würde) sondern ein "Geist" Bild. Mit "Geist" Bild meine ich, dass was vorher in prevImage zu sehen war. Allerdings hat buildImage doch nichts mit prevImage zu tun, oder seh ich das falsch?
4.) Dieser Code ist wesentlich reduziert. Einige stellen werden für den geneigten Leser unnütz ausschauen. Ignoriert es einfach. Bevor jemand fragt: Ja das Problem besteht auch bei dieser gekürzten Version.
Es folgt nun der Code-Teil:
[HIGHLIGHT="Java"]
AbstractVO[] sel = form.apGrid.getSelectedVOs();
form.prevImage.flush();
int prevWidth = form.prevImage.getWidth();
int prevHeight = form.prevImage.getHeight();
Graphics2D g = (Graphics2D)form.prevImage.createGraphics(); //hier hole ich mir Graphics-Objekt um ins Bild zu zeichnen.
g.setColor(Color.GRAY);
g.fillRect(0, 0, prevWidth, prevHeight);
int pictureWidth = prevWidth;
int pictureHeight = prevHeight;
double ratioX = 1;
double ratioY = 1;
pictureWidth = (int)(pictureWidth*ratioX);
pictureHeight = (int)(pictureHeight*ratioY);
ArbeitsplatzVO apvo = (ArbeitsplatzVO) sel[0];
if(apvo.vorschau!=null){
try {
ResolutionVO resvo = (ResolutionVO)apvo.getFormDefinitions().getDataTable(ResolutionVO.TABLE_NAME).getVO();
Rectangle recordedRes = resvo.getResolution();
ByteArrayInputStream bais = new ByteArrayInputStream(apvo.vorschau);
BufferedImage voImage = ImageIO.read(bais); //Dies ist ein Vorschaubild
BufferedImage buildImage = new BufferedImage(prevWidth, prevHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D build_g = buildImage.createGraphics();
build_g.setColor(Color.DARK_GRAY);
build_g.fillRect(0, 0, prevWidth, prevHeight);
build_g.setColor(Color.LIGHT_GRAY);
build_g.fillRect(0, 0, device.getDefaultConfiguration().getBounds().width/4, device.getDefaultConfiguration().getBounds().height/4);
if(recordedRes.intersects(device.getDefaultConfiguration().getBounds())){
build_g.drawImage(voImage, 0, 0, device.getDefaultConfiguration().getBounds().width/4, device.getDefaultConfiguration().getBounds().height/4,
(device.getDefaultConfiguration().getBounds().x - recordedRes.x)/4, (device.getDefaultConfiguration().getBounds().y - recordedRes.y)/4,
(device.getDefaultConfiguration().getBounds().x - recordedRes.x + device.getDefaultConfiguration().getBounds().width)/4,
(device.getDefaultConfiguration().getBounds().y - recordedRes.y + device.getDefaultConfiguration().getBounds().height)/4, null);
}
build_g.setColor(Color.BLACK);
build_g.drawRect(-1, -1, (device.getDefaultConfiguration().getBounds().width/4)+1, (device.getDefaultConfiguration().getBounds().height/4)+1);
g.drawImage(buildImage, 0, 0, (int)(buildImage.getWidth()*ratioX), (int)(buildImage.getHeight()*ratioY), null);
} catch (Exception e1) {
e1.printStackTrace();
}
}
form.southPanel.repaint(form.prevSP);
[/HIGHLIGHT]
Vielen Dank im Voraus für eure Mühen.
Ich werde versuchen eine Version zu stricken die man mit copy&paste mal laufen lassen kann.