repaint()-Problem

Status
Nicht offen für weitere Antworten.

Lionhead

Mitglied
Wie kann man gezeichnete Images von einer repaint()-Anweisung auschliessen? Also wenn ich jetzt n Bild zeichne (drawImage(....)) kann ich irgendwie erreichen dass dieses nicht repainted wird. (brauch für n Hintergrund des dauert ewig wenn der bei jedem Aufruf der paint-Methode neu gezeichnet wird)
 
B

Beni

Gast
Wie meinst du das? Du baust jedes mal das Bild neu auf? Dann mach ein boolean "imagePainted" und eine schöne if-Abfrage.

@conehead
Spam wird hier gnadenlos gelöscht
 

Lionhead

Mitglied
Wenn ich in der paint-Methode eine if Abfrage um das zu zeichnende Bild mache dann wird es ja immer gezeichnet wenn die Bedingung erfüllt ist . Das heisst wenn ich repaint() mache dann wird dass Hintergrund-Bild ja trotzdem noch jedesmal neu geladen (bei jedem repaint() ) oder es erscheint gar nicht wenn die Bedingung nicht erfüllt ist.
Was ich wissen wollte wie kann ich erreichen das mein Hintergrund-Bild beim aufruf der repaint()-Methode nicht neu aufgebaut wird sondern einfach bleibt. gibts da vielleicht irgendwas was man beim Image-Objekt setzten kann (z.B irgendein boolean) ob es vom repaint() btroffen sein soll oder net.
 

Xenophon

Aktives Mitglied
Das mit der if-Abfrage sollte schon funktionieren. Mach Dir eine Variable "boolean imagePainted = flase;". Bei "if(!imagePainted)" gehst Du in den Zweig zum zeichnen und setzt sie dort gleich mit auf true. So sollte nur beim ersten Durchgang gezeichnet werden und wenn Du die Variable selber wieder auf false setzt.
 

K-Man

Bekanntes Mitglied
Ich glaube er meint, dass er ein bereits gezeichnetes Bild nicht mehr zeichnen lassen will.
Er lädt zum Beispiel ein Image in ein Frame. Wenn er das zweite Image lädt, dann will er nicht, dass das erste nochmal gezeichnet wird. Bei repaint wird aber alles neu gezeichnet. Macht er es nun mit dem boolean, dann zeichnet er das Bild zwar nicht mehr, aber es verschwindet auch vom Frame.
Ich kann mir nur vorstellen, dass du jedes Bild in einer eigenen Component zeichnest und nur diese repaintest, wenn sich da was verändert. Andernfalls kann man glaub ich bestimmen, welcher bereich "zeichenbar" ist. Aber ich weiß nicht, ob dann evtl andere Bilder, die somit aus dem Zeichenbereich fallen, gelöscht werden. Mit "zeichenbar" mein ich zb, dass man nicht über die Menüleiste zeichnen kann, da es nicht im Clipping-Bereich liegt...oder wie man das gleich wieder nennt ;)
 

Lionhead

Mitglied
Genau dass mein ich K-man. Gibts vielleicht so ne repaint -Mthode mit der man nur einen bestimmten Bereich repainten kann? Oder kann ich z.B etwas in ein Panel zeichnen und dann irgendwie das Panel repainten?
 

Lionhead

Mitglied
Vergiss es die ist riesig, dass mit dem bestimmten Bereich repainten ist schon nicht schlecht. aber das hilft mir bei meinem Problem nicht viel weiter... Ich möchte ja ein Image als Hintergrund auf dass zeichne ich dann Spielfiguren u.s.w (iss fürn Spiel). aber wenn ich dann repainte sollen nur die Spielfiguren repainted werden nicht dass Hintergrund-Bild! Da dass recht groß ist dauert des ewig. Was ich jetzt wissen wollte Kann man ein Image irgendwie vom repaint ausschliesen so das es nicht neugezeichnet wird aber bleibt! Schwere Frage ich weiss aber ein klares nein is auch ok.
 
B

Beni

Gast
Ich frage mich, ob wir aneinander vorbeireden.
Ich verstehe unter "Bild zeichnen" diesen Befehl:
Code:
Graphics g = ...
Image img = ...
g.drawImage( img, 0, 0, this ); // oder so ähnlich
Aber nach meiner Erfahrung ist das nicht allzu schlecht. ???:L

Und es lässt sich nicht umgehen. Um die Figuren an ihren neuen Position zu zeichnen, muss das Panel ja zuerst gelöscht werden. (Ansonsten würden sie eine schöne Spur hinter sich herziehen...).

Ich missverstehen dich?
 

L-ectron-X

Gesperrter Benutzer
Versuche doch mal das Bild zu komprimieren, oder die Pixeldichte (dpi) herunterzusetzen, dann wird das Bild schneller geladen. Ansonsten kann man das Bild in ein Offscreen-Image (Speicher-Bild) laden, dass man schneller zur Verfügung hat. (Ich hab's mal irgendwo gelesen und hier auch schon mal gepostet)
Geht es nur ums Zeichnen, oder auch ums Laden? Beim Laden kannst Du dann auch den MediaTracker verwenden.
Eine Anwendung, die aber Bilder von der lokalen Festplatte läd, sollte damit aber keine Probleme haben.
 

K-Man

Bekanntes Mitglied
Du kannst dein Problem vielleicht umgehen. Du teilst dein Bild in kleine Einzelbilder. Diese fügst du in deinem Fenster zusammen. Beim repainten musst du halt dann abfragen, welche dieser Einzelbilder neu gezeichnet werden müssen. Den Rest kannst du dann aussließen. Du musst aber noch die update-Methode zusätzlich zur paint-Methode überschreiben. Machst du das nicht, dann wird alles gelöscht.
Auf gut deutsch:
Du teilst deinen Hintergrund in 20 Bilder. Beim nächsten Bild stellst du fest, dass du nur die Bilder 10, 11 und 12 neuzeichnen musst. Deine update-Methode löscht nur die Bilder 10, 11 und 12. Paint zeichnet jetzt nur diese Bilder und schon musst du deutlich weniger neuzeichnen, als normal.

Update sieht normal so aus:
Code:
public void update(Graphics g)
{
    g.setColor(getBackground());
    g.fillRect(0, 0, width, height);
    g.setColor(getForeground());
    paint(g);
}
Hier wird das komplette Fenster neu gezeichnet. Du überschreibst die Methode, damit sie nur noch die relevanten Teile des Fensters löscht. Die paint-Methode zeichnet jetzt genau diese Bilder neu.

Anmerkung:
Ich hab dieses Verfahren noch nicht ausprobiert. Ist mir jetzt grad so spontan eingefallen. Kann also nicht versprechen, dass es was nützt. Klingt aber schon mal vielversprechend. Was sagen die anderen dazu? Würd micht übrigens interessieren, ob es was bringt ;)
 

K-Man

Bekanntes Mitglied
Wo sind denn die Profi(e)s? ;)
Mich würde auch mal interessieren, was ihr zu meiner Idee halten. Ist die für die Katz oder vielleicht doch anwendbar?
 

K-Man

Bekanntes Mitglied
Mir ist noch was eingefallen. Man kann ja zwei Components übereinanderlagern. Das Hintere hat das Hintergrundbild und das Vordere ist durchsichtbar und zeichnet die Spielfigur.
Mich interessiert eigentlich immer noch, ob ich Mist erzähle, oder nicht....;)
 
B

Beni

Gast
K-Man hat gesagt.:
Mich interessiert eigentlich immer noch, ob ich Mist erzähle, oder nicht....;)
Meine ganz klar und sicher sehr hilfreiche Antwort: keine Ahnung :wink:

Allerdings finde ich es immer noch komisch, dass man solange benötigt um ein Bild zu zeichnen... ???:L
 

L-ectron-X

Gesperrter Benutzer
Ich finde die Idee gut und denke auch, dass sie funktioniert. Wenn man sich die Doku der paint()-Methode mal anschaut:
API-Documentation - java.awt.Component#paint(Graphics g) hat gesagt.:
...
This method is called when the contents of the component should be painted; such as when the component is first being shown or is damaged and in need of repair.
...
Sinn gemäß: Diese Methode wird aufgerufen, wenn der Inhalt einer Component gezeichnet werden sollte; z.B. wenn die Component zum ersten Mal gezeichnet werden soll oder sie beschädigt ist und eine Reparatur benötigt.

Das hört sich zumindest so an, wie K-Man es sich dachte. Und ich denke mal weiter...
Wenn man nun in der update()-Methode den Bereich löscht, der neu gezeichnet werden soll, müsste die paint()-Methode nur die neu zu zeichnenden Bilder zeichnen.

@Lionhead: Wie lang (in kB) ist das Bild, was Du laden und zeichnen möchtest?
 

K-Man

Bekanntes Mitglied
Da fällt mir gerade auf, dass man paintComponent überschreiben muss, nicht paint. Wir sind ja hier im swing-Bereich und nicht im awt ;)
 

Lionhead

Mitglied
Ich blicks solangsam net mehr... :autsch:
Kann man den Hintergrund net einfach mit der setBackground-Methode setzten, der man ein Image übergibt. Der Background wird ja sowieso nicht repainted , dann wär mein Problem gelöst.
 

K-Man

Bekanntes Mitglied
Lionhead hat gesagt.:
Ich blicks solangsam net mehr... :autsch:
Kann man den Hintergrund net einfach mit der setBackground-Methode setzten, der man ein Image übergibt. Der Background wird ja sowieso nicht repainted , dann wär mein Problem gelöst.
Mit setBackground() kannst du nur die Farbe des Hintergrundes bestimmen. Du kannst kein Image übergeben...
 

L-ectron-X

Gesperrter Benutzer
Eigentlich doch. Mit einem Offscreen-Image könnte es funktionieren.
Code:
Graphics g; 
Image hintergrund; 
... 
public void init() { 
... 
  hintergrund = createImage(breite, hoehe); 
  g = hintergrund.getGraphics(); 
} 

public void update(Graphics g) { 
  g.setColor(getBackground()); 
  g.fillRect(x, y, breite, hoehe);
  g.setColor(getForeground()); 
  paint(g); 
} 

public void paint(Graphics g) { 
  //zeichnen 
  //zum Schluss Offscreen-Image auf die Oberfläche kopieren 
  g.drawImage(hintergrund, 0, 0, this); 
}
In diesem Beispiel wird ein Image-Objekt mit createImage() erzeugt und dem Graphics-Objekt (Zeichenfläche) übergeben. Das kann auch ein anderes Image-Objekt sein, welches von wo anders beschafft wird. Dann muss aber die update()-Methode angepasst werden.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3
J [gelöst] repaint problem AWT, Swing, JavaFX & SWT 2
M problem mit repaint()-Methode[gelöst] AWT, Swing, JavaFX & SWT 8
G problem mit threads/repaint ! AWT, Swing, JavaFX & SWT 2
D Problem mit Netbeans und repaint() AWT, Swing, JavaFX & SWT 5
E Problem mit repaint() AWT, Swing, JavaFX & SWT 11
K Problem mit JLabel, Rechteck, repaint() ;) AWT, Swing, JavaFX & SWT 2
K Problem repaint()->paintComponent AWT, Swing, JavaFX & SWT 9
M Problem bei Repaint von Panels AWT, Swing, JavaFX & SWT 2
L Swing repaint problem AWT, Swing, JavaFX & SWT 7
B Problem bei repaint AWT, Swing, JavaFX & SWT 5
V repaint problem AWT, Swing, JavaFX & SWT 12
A Repaint-Problem AWT, Swing, JavaFX & SWT 4
S repaint()-Problem AWT, Swing, JavaFX & SWT 6
S Repaint()-Problem im GBL? AWT, Swing, JavaFX & SWT 5
S paint/repaint problem mit awt/swing? AWT, Swing, JavaFX & SWT 2
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben