Huhu erstmal!
Fange gerade an mich mit Grafikoberflächen zu beschäftigen und habe dabei ein Problem, dass bei einem Beispiel zu AWT aus dem Buch "Handbuch der Javaprogrammierung" von Guido Krueger auftritt.
Es geht um folgendes Programm:
Das Programm dient zur Demonstration von Component Events. Jedesmal wenn man die Größe des Fensters verändert oder das Fenster verschiebt, sollte rapaint() aufgerufen werden und damit die neue Position des Fensters als shematische Grafik in meinem Frame ausgegeben werden. Soweit die Theorie:
Bei mir passiert allerdings folgendes: Wenn ich das Programm ausführe und z.B. die Fenstergröße ändere, passiert grafisch gesehen garnichts, also das veränderte Fenster (also die grafische Darstellung aus Rechtecken) wird nicht ausgegeben, sondern ich sehe weiterhin das alte Rechteck.
Minimiere ich nach einer Veränderung des Fensters allerdings selbiges (also es in den Hintergund setzen) und rufe es danach wieder auf, wird jetzt die richtige Grafik ausgegeben (also das Rechteck in richtiger Größe).
Zuerst dachte ich, das rapaint() würde nicht funktionieren und habe deshalb mal nen System.out.println("paint()"); ans Ende der Methode paint(...) gesetzt. Zu meiner Überrschung sehe ich dadurch allerdings in der Console, dass die paint(...) durchaus bei jeder Veränderung des Fensters korrekt aufgerufen wird.
Nun meine Frage: Wieso wird die Grafik (also die Rechtecke) nicht sofort aktualisiert ausgegeben, obwohl es richtig aufgerufen wird?!
Danke im voraus für alle Tipps.
Fange gerade an mich mit Grafikoberflächen zu beschäftigen und habe dabei ein Problem, dass bei einem Beispiel zu AWT aus dem Buch "Handbuch der Javaprogrammierung" von Guido Krueger auftritt.
Es geht um folgendes Programm:
Code:
/* Listing2902.java */
import java.awt.*;
import java.awt.event.*;
class ComponentRepaintAdapter
extends ComponentAdapter
{
public void componentMoved(ComponentEvent event)
{
event.getComponent().repaint();
}
public void componentResized(ComponentEvent event)
{
event.getComponent().repaint();
}
}
class BirdsEyeFrame
extends Frame
{
public BirdsEyeFrame()
{
super("BirdsEyeFrame");
addWindowListener(new WindowClosingAdapter(true));
addComponentListener(new ComponentRepaintAdapter());
setBackground(Color.lightGray);
}
public void paint(Graphics g)
{
Dimension screensize = getToolkit().getScreenSize();
Dimension framesize = getSize();
double qx = framesize.width / (double)screensize.width;
double qy = framesize.height / (double)screensize.height;
g.setColor(Color.white);
g.fillRect(
(int)(qx * getLocation().x),
(int)(qy * getLocation().y),
(int)(qx * framesize.width),
(int)(qy * framesize.height)
);
g.setColor(Color.darkGray);
g.fillRect(
(int)(qx * getLocation().x),
(int)(qy * getLocation().y),
(int)(qx * framesize.width),
(int)(qy * getInsets().top)
);
g.drawRect(
(int)(qx * getLocation().x),
(int)(qy * getLocation().y),
(int)(qx * framesize.width),
(int)(qy * framesize.height)
);
}
}
public class Listing2902
{
public static void main(String[] args)
{
BirdsEyeFrame wnd = new BirdsEyeFrame();
wnd.setSize(300,200);
wnd.setLocation(200,100);
wnd.setVisible(true);
}
}
Das Programm dient zur Demonstration von Component Events. Jedesmal wenn man die Größe des Fensters verändert oder das Fenster verschiebt, sollte rapaint() aufgerufen werden und damit die neue Position des Fensters als shematische Grafik in meinem Frame ausgegeben werden. Soweit die Theorie:
Bei mir passiert allerdings folgendes: Wenn ich das Programm ausführe und z.B. die Fenstergröße ändere, passiert grafisch gesehen garnichts, also das veränderte Fenster (also die grafische Darstellung aus Rechtecken) wird nicht ausgegeben, sondern ich sehe weiterhin das alte Rechteck.
Minimiere ich nach einer Veränderung des Fensters allerdings selbiges (also es in den Hintergund setzen) und rufe es danach wieder auf, wird jetzt die richtige Grafik ausgegeben (also das Rechteck in richtiger Größe).
Zuerst dachte ich, das rapaint() würde nicht funktionieren und habe deshalb mal nen System.out.println("paint()"); ans Ende der Methode paint(...) gesetzt. Zu meiner Überrschung sehe ich dadurch allerdings in der Console, dass die paint(...) durchaus bei jeder Veränderung des Fensters korrekt aufgerufen wird.
Nun meine Frage: Wieso wird die Grafik (also die Rechtecke) nicht sofort aktualisiert ausgegeben, obwohl es richtig aufgerufen wird?!
Danke im voraus für alle Tipps.