Moin
Habe ich das so richtig
verstanden: Ich lege in der init() ein Graphics g_Fade_In =
new Graphics(); an und mache meine
g_Fade_In. add (steuerButton); g_Fade_In.add(meinCanvas);
usw…
nein, nicht ganz:
Du erzeugts deine GUI wie immer und kommts dann irgendwann zu deinem normalen Pane/JPane (der einfachheit halber hier „comp“ genannt). Davon machts du ein Image:
Image komplett = comp.createImage(int width, int height); //schneller
ODER:
Image komplett = new BufferedImage (Höhe, Breite, TYPE_RGB) //langsamer, aber zuverlässiger
und malts das comp in das image:
Graphics g = komplett.getGraphics();
comp.paint(g); //*
komplett enthält nun ein Bild der GUI. Das Bild wird auf nix reagieren, man kann da nix anklicken. (deshalb bevorzuge ich Variante 2, aber ich schreib ja auch keine 1.1.8-Applets)
Jetzt gibts 2 Möglichkeiten:
Entweder du zeigts ein anderes temporärers Bild an oder du überschreibst comp.paint(Graphics g). Wenn du paint überschreibst musst du bei dem Aufruf * aufpassen.
–Variante temp-Bild:
Image temp = comp.createImage(int width, int height);
JLabel JB = new JLabel (new ImageIcon(temp));
Das Label JB zeigt du im Applet an.
Graphics g2 = temp.getGraphics();
nun mit g2.drawImage (…) Teile aus komplett in temp reinmalen, ein repaint von JB auslösen und abwarten (SwingUtils.invokeAndWait(Runnable doRun), man will ja dem AWT-Thread nicht zuviel auf die Füsse tretten), neue Teile reinmalen … bis das Bild durch ist. Dann JB aus dem Applet entfernen und die reale GUI einfügen. fertig.
–Variante überschriebenes comp.paint(Graphics g):
In der paint-Methode bei jedem Aufruf mehr Teile von komplett in g malen. Am Ende von paint(Graphics g) per repaint() den nächsten Aufruf auslösen. Wenn alle Teile komplett sind in paint nur noch super.paint(g) aufrufen und damit die orginale anzeigen.
In beiden Fällen nicht vergessen die Bilder zu entsorgen (Image.flush()) und an java.awt.Toolkit.sync() denken.
Wenn ich dann das Image img_von_g_Fade_In habe, dann kann ich
doch irgendwie mit dem PixelGrabber jedes einzelne Pixel in ein
int[][] überführen.
Das würd ich nicht tun. Beim graben werden die Bildinformationen in das java-interne 3x-int-Format übersetzt. Beim malen müssten sie zurückübersetzt werden… das frisst viel CPU-Leistung, vor allem bei X-basierten System (Unix/Linux/MacOS/…)
Wenn alles fertig ist, kommt das eigentliche Graphics g
dran, und die Buttons etc. werden aktiv und anklickbar.
Der Satz zeigt mir dass du einen kleinen Denkfehler drin hast:
Graphics-Objecte werden immer von der JVM erzeugt. Man kann sie nicht austauschen. Der Programmierer tauscht Image’s oder paint-Methoden aus, aber nie Graphics.
Gehts so?
Wenn nicht, frag nochmal… oder kuck mal auf http://www.durius.com/ ob nicht schon was passendes exisitiert. Ist aber nicht ganz gratis.
cu