Swing Zoom mit JPanel und repaint() ...

Status
Nicht offen für weitere Antworten.

Dragonfire

Bekanntes Mitglied
Hihu,
hab mal wieder ein Problem,
dass mich Verzweifeln lässt ...

Ich hab eine Art ZoomPanel programmiert ...
Hat ein Hintergrundbild und ein weiteres welches dann vergrößert wird ...
Hier mal ein kurzer Einblick in meiner Klasse ZoomImage3:

[highlight=Java]/**
* modifizierte "paint"-Methode,
* zeichnet das jeweiliges Hintergrundbild und aktuelle Bild.
*/

public void paintComponent(Graphics g)
{

super.paintComponent(g);
try
{
g.drawImage(this.bakImg, 0, 0, this);
}
catch(Exception e)
{}
try
{
g.drawImage(this.currentImage, startX, startY, this);
}
catch(Exception e)
{}
}

/**
* interne zoom-Methode.
*/
private void myZoom()
{
this.display = true;
//rendering of the resizes images
for(int i = 0; i < tmpImg.length; i++)
{
tmpImg = zoomImg.getScaledInstance(tmpWidth, tmpHeight, quality);
tmpHeight += pixel;
tmpWidth += pixel;
}

//repaint
for(int i = 0; i < tmpImg.length; i++)
{
changeXY();
currentImage = tmpImg;
repaint(this.startX, this.startY,
currentImage.getWidth(null), currentImage.getHeight(null));
try
{
Thread.sleep(speed * speed / (i+1) );
}
catch(Exception e)
{
System.out.println("Thread interrupted: ZoomImage @" + e);
}
}
repaint();
} [/highlight]

Mit meiner Testmethode geht alles wunderbar:

[highlight=Java]public void testZoom2(int n, int modus)
{

//Bild zum Vergrößern
BufferedImage zoomImg = null;

//Frame
javax.swing.JFrame f = new javax.swing.JFrame("TEST");

//mein ZoomPanel
ZoomImage3 p = new ZoomImage3(this.imageProducer);
try
{
//holt sich Hintergrundbild
BufferedImage bakImg = javax.imageio.ImageIO.read(getClass().getResource("test\\test.jpg"));
p.setBakImg(bakImg);
}
catch(Exception e)
{}

//init Frame
f.add(p);
f.pack();
f.setVisible(true);

//benötigt für das Bild zum Vergrößern
PossibleAnswer pa = new PossibleAnswer(new JGraphX());

for(int i = 0; i < n; i++)
{
//holt sich das zu vergrößerne Bild
zoomImg = pa.getImage(this.imageProducer);
p.setImg(zoomImg,100,100,100,100);
//zoomt
p.zoomImage(modus);
}
}[/highlight]

Sobald ich das in meiner kompletten GUI einfüge,
passiert beim zoom Vorgang nichts !!
die Schleife in ZoomImage3 mit dem repaint() wird ausgeführt ...
(mit System.out.println & debugging getestet)
aber die GUI ignoriert das irgendwie ...
nur der letzte Durchgang wird gezeichnet ...

Hat jemand eine Idee?

Ich glaube mein Ansatz ist falsch ...
ein Panel darf ja normalerweise nicht sagen,
wann es gezeichnet wird ...
oder fällt ein Zoom-Vorgang unter Sonderfälle?

Meine GUI besteht nur aus mehrer JPanels mit JLabels, einer Menübar.
Ein JLabel ist eine Uhr (Runnable).

PS.:
Hatte mit der Klasse schonmal Probleme:
http://www.java-forum.org/awt-swing-swt/80224-zoomimage-flackert-fehler-repaint-aufruf-geloest.html
 
mach mal in deine catch blöcke ausgaben vielleicht hagelt da was raus...
 
Wie gesagt,
mit der Testmethode gehen alle Funktionen die ich getestet habe
und die ich brauche ...

Nur in der GUI will es nicth funktionieren,
obwohl ich nicht viel anders mache :-(

Die repaint()-methode wird ja auch ausgeführt ..
halt nur ohne Effekt !!!
Mein Programm steht einfach still ..
und der Benutzer bekommt von dem Zoom-Vorgang nichts mit.

Hier mal,
wie ich mein Panel benutze:

[highlight=java] this.width = 100;
this.height = 100;
this.startX = 0;
this.startY = 0;


//bestimme Zoom-Modus; suche ID
int id = -1;
for(int i = 0; i < this.button.length; i++)
{
if(selectAnswer == this.button)
id = i;
}

//wenn id vorhanden
if(id != -1)
{
//setzte Hintergrund
//KLON wird benötigt !!! sonst ist zoom == bak
this.bTmpImg = this.imageProducer.getImage(this.answerPanel);



//klonen
BufferedImage klon = new BufferedImage(bTmpImg.getWidth(), bTmpImg.getHeight(), BufferedImage.TYPE_INT_ARGB);
klon .getGraphics().drawImage(bTmpImg,0,0,null);

this.zoomP.setBakImg(klon );

//setzte Bild zum Vergrößern; id = position
this.zoomP.setImg(this.a[id].getImage(this.imageProducer),
this.startX,
this.startY,
this.width,
this.height);

//setzte Zoom-Modus
this.zoomP.setModus(id);

//tausche Panels
this.removeAll();
this.add(this.zoomP);
this.updateUI();

//zoome
this.zoomP.zoomImage();[/highlight]

die vorgeschlagene Änderung hat leider zu keiner Ausgabe geführt:


[highlight=Java]public void paintComponent(Graphics g)
{

super.paintComponent(g);
try
{
g.drawImage(this.bakImg, 0, 0, this);
}
catch(Exception e)
{
System.out.println("ZoomImage3: paint bakImg @ " + e);
}
try
{
g.drawImage(this.currentImage, startX, startY, this);
}
catch(Exception e)
{
System.out.println("ZoomImage3: paint currentImg @ " + e);
}
}[/highlight]
 
Zuletzt bearbeitet:
Ich hab den Fehler jetzt gefunden,
ich darf kein repaint() verwenden,
sondern muss:

paintImmediately(int x, int y, int w, int h)

verwenden.

Kann man das auch mit repaint() machen?

Ich vermutet mal meine Implementierung (myzoom) mit "Thread.sleep" hat das schnelle Neuzeichen nicht unterbunden und alles angehalten.
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Zurück
Oben