Reihenfolge von Befehlen - hier repaint() zu spät

Status
Nicht offen für weitere Antworten.

virtualAudio

Aktives Mitglied
Hi Leute,

es ist mir diesmal ein wenig zu spät für ein KSKP...und ich hab die Hoffnung, dass vielleicht auch so jemand Rat weiß und das Problem gelöst sein kann bevor ich dazu komme ein KSKP zu schreiben.

(eclipse)
Code:
					if(e.getActionCommand().equals("Screenshot")){
						new Say("popup weg");
						popUpM.setVisible(false);		//popupmenü wieder schliessen
						new Say("davor");
						pane.repaint();
						new Say("danach");

						mutter.getScreenshot(pane, new Rectangle(getLocation().x, getLocation().y,getWidth(),getHeight()));
						
					}

dieses codeschnipsel aus dem Listener eine popupmenüs sollte eigentlich ein JPanel neuzeichnen, da das popup deaktiviert wird und an dessen Stelle sonst ein Fleck "nichts" übrigbleibt, und dann vom frisch gezeichneten JPanel einen screenshot machen.

Probelm: am screenshot sieht man den Fleck der nicht neu gezeichnet wurde. Ich hab dann diese ganzen Strings dazwischen geschrieben um zu sehen in welcher Reihenfolge abgearbeitet wird.

zur Erklärung:
Code:
public void Say(String s) {System.out.println("----> " + s)};

in der paintComponent steht zusätzlich noch "bin in paint" und in der getScreenshot steht "cheeeese".

Eigentlich sollte die Ausgabe also lauten: popup weg, davor, bin in paint, danach, cheeeese

sie lautet aber: popup weg, davor, danach, cheeeese, bin in paint -> was dann auch die nicht aktualisierte Grafik in meinem Screenshot(jpg) zeigt.


Vielleicht bringt das jemanden ja schon auf eine Idee woran es liegen könnte. Würd mich freuen.

Beste Grüße
Andi
 

virtualAudio

Aktives Mitglied
gerade hab ich noch ausprobiert herauszufinden ob repaint() vielleicht garnicht an dieser Stelle sondern erst wieder ausgeführt wird, wenn der FileSaveDialog(zum screenshot abspeichern) geschlossen wird.
Allerdings hab ich jetzt eine getScreenshot version die ohne diesen Dialog auskommt und immer an die selbe Stelle speichert...da steht auch nach dem ganzen 3x"bin in paint"...kann also doch sein, dass da mein Befehl die repaint auszuführen noch ausgeführt wird (zu spät wie gesagt)
hmmm

lg Andi
 
B

Beni

Gast
Repaint hat keinen direkten Einfluss, es wird nur eine Notiz gemacht "beim nächsten Durchlauf bitte zeichnen." Der EventDispatcherThread wird diese Notiz sehen, und dann was zeichnen. Solange du aber den EDT in deiner "actionPerformed"-Methode blockierst, hat er überhaupt keine Möglichkeit etwas neu zu zeichnen.

In diesem Fall weiss ich nicht, für was der Screenshot gut sein sollte. Wenn du das Panel in einem Bild haben willst, lass es lieber direkt auf ein Bild zeichnen. Dann hast du auch keine Probleme, falls es verdeckt ist.
 

André Uhres

Top Contributor
Code:
       SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                mutter.getScreenshot(pane, new Rectangle(getLocation().x, getLocation().y,getWidth(),getHeight())); 
            }
        });
 

virtualAudio

Aktives Mitglied
Hi Leute, danke für die Antwort.

@Beni:
müsste ich dann bei jedem paint ein neues BufferedImage erzeugen? um auf diesem zu zeichnen?
Bei jeder Grössenveränderung des JPanels müsste ja eine andere grösse des Bildes erzeugt werden auf dem gezeichnet wird richtig?

Frisst das nicht sehr viel Rechenleistung?
Vor allem wegen diesen Bedenken hab ich das bis jetzt nicht gemacht. Jetzt da Du mir den Grund dafür genannt hast warum repaint() nicht gleich ausgeführt wird, werd ich es mal versuchen.

@André: leider hab ich von threads noch nicht viel Ahnung. invoke later würde zu sowas führen wie führe zuerst repaint() aus und erst dann erzeuge den Screenshot?

Beste Grüße
Andi
 

Wildcard

Top Contributor
Ich bin mir nicht ganz sicher was du eigentlich vorhast, aber wenn dir das hilft, es gibt auch eine Möglichkeit direkt neu zu zeichnen:
Code:
paintImmediately(Rectangle r);
 

virtualAudio

Aktives Mitglied
wow..ich glaube das wäre perfekt...schauma mal


warum ich auf die Leistung achte...

die zu zeichnenden Daten sind von der cursorposition abhängig, sprich paint wird immer ausgeführt wenn sich die Maus gerade über dem Panel bewegt...
 

Wildcard

Top Contributor
virtualAudio hat gesagt.:
warum ich auf die Leistung achte...
die zu zeichnenden Daten sind von der cursorposition abhängig, sprich paint wird immer ausgeführt wenn sich die Maus gerade über dem Panel bewegt...
Aber vorsicht:
bei paintImmediatly werden redundante Aufrufe nicht abgefangen weshalb es schnell unmengen an Rechenzeit verschlingen kann. Achte darauf den so gezeichneten Bereich möglichst klein zu halten.
 

virtualAudio

Aktives Mitglied
Hi wildcard,

erstmal danke für den Tipp....erstmal funktioniert der Spaß wie gewünscht.

Leider funktioniert es nicht wenn ich als neu zu zeichnende Fläche PupUpM.getBounds() verwende...mit pane.getbounds() funktioniert es...vielleicht spiel ich mich da noch.

meinst Du mit redundant...mehrere Aufrufe wo es eine auch tun würde?
Sollte hier kein Problem darstellen da ich paintImmediately nur einmal vor dem Screenshot aufrufe...ansonsten verwende ich weiterhin überall rapaint().
Oder meinst Du etwas anderes?

Dankbarste Grüße ;)
 

Wildcard

Top Contributor
Leider funktioniert es nicht wenn ich als neu zu zeichnende Fläche PupUpM.getBounds() verwende...mit pane.getbounds() funktioniert es...vielleicht spiel ich mich da noch.
Einfach mal Debuggen und schauen was da ankommt...
meinst Du mit redundant...mehrere Aufrufe wo es eine auch tun würde?
Sollte hier kein Problem darstellen da ich paintImmediately nur einmal vor dem Screenshot aufrufe...ansonsten verwende ich weiterhin überall rapaint().
Oder meinst Du etwas anderes?
Ja, so ziemlich genau das hab ich gemeint. Wenn du es allerdings nur einmal aufrufst sollte das bei dir wirklich kein Problem sein.
 

virtualAudio

Aktives Mitglied
hmmm, laut Debugger ist width=181, height =89;
dann gibts zwei Variablen x und y die sind 0 ....dachte das erklärts

es gibt aber noch zwei variablen desiredlocationx und y die haben einen Absolutwert (Bildschirm) der passen würde und aus dem man sich ja leicht ausrechnen könnte wo man neuzeichnen muss. Allerdings: versteh ich nicht warum der wert x und der wert y die ja über getX und getY angesprochen werden 0 ist und bleibt (hab an verschiedenen stellen breakpoints um das zu überprüfen... zB auch bei PopUpM.setVisible(true)...und zumindest dort wären x und y wenn die dafür zuständig wären > = 0... sind sie nicht...wenn sie aber nicht zuständig sind für die Position des popups versteh ich nicht warum getX() und getY() diese zurückliefern.

über desiredLocation hab ich in der API nix gefunden... hmm

naja, es funktioniert ja wenn ich das ganze panel neu zeichnen lasse... interessant wärs trotzdem...

gruuhs Andi
 

André Uhres

Top Contributor
virtualAudio hat gesagt.:
..@André: leider hab ich von threads noch nicht viel Ahnung.
invoke later würde zu sowas führen wie führe zuerst repaint() aus und erst dann erzeuge den Screenshot?..
Ja, so funktioniert das.
Btw, mit invokeLater wird kein neuer Thread gestartet.
Der Screenshot wird lediglich verzögert: erst repaint, dann Screenshot (alles auf dem Eventdispatching Thread).
 

virtualAudio

Aktives Mitglied
Danke nochmal allen Helfern!!

Hat mir nicht nur bei diesem Problem, dass dank Euch ja schnell gelöst wurde, geholfen, sondern hat auch mein Verständnis gegenüber Java bereichert. Super!

beste Grüße
Andi
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
J Methoden Die Reihenfolge der Iterator-Elemente umkehren Java Basics - Anfänger-Themen 3
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
D Array Elemente sortieren in aufsteigender Reihenfolge Java Basics - Anfänger-Themen 10
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
I Array in umgekehrter Reihenfolge - Erklärung - Java Basics - Anfänger-Themen 3
R Werte und Reihenfolge in 2d Arrays vergleichen Java Basics - Anfänger-Themen 5
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
M Feste Reihenfolge von dem Ablauf von Methoden Java Basics - Anfänger-Themen 7
H Knoten-Reihenfolge einer LinkedList invertieren Java Basics - Anfänger-Themen 11
L Richtige Reihenfolge der Dateien Java Basics - Anfänger-Themen 5
C Werte im Vector in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 14
C Vector-Inhalt in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 6
A String in umgekehrter Reihenfolge ausgeben Java Basics - Anfänger-Themen 7
L Reihenfolge Ausgabe Java Basics - Anfänger-Themen 5
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
D TAB Reihenfolge im JSinner Java Basics - Anfänger-Themen 1
RowdyN Methoden Befehle in zufälliger Reihenfolge ausführen lassen Java Basics - Anfänger-Themen 5
B Arrays in Reihenfolge vertauschen Java Basics - Anfänger-Themen 6
J Reihenfolge im Vector lässt sich nicht drehen Java Basics - Anfänger-Themen 9
M Array Reihenfolge umdrehen Java Basics - Anfänger-Themen 9
J Klassen Reihenfolge beim Aufruf von Klassen Java Basics - Anfänger-Themen 1
L zweidimensionales char array reihenfolge ändern ? Java Basics - Anfänger-Themen 2
S Warum muss ich die operationen mit AffineTransform in umgekehrter Reihenfolge ausfuehren..? Java Basics - Anfänger-Themen 4
M Reihenfolge von Testmethoden in JUnit beeinflussen Java Basics - Anfänger-Themen 2
M Ausgabe in falscher Reihenfolge Java Basics - Anfänger-Themen 7
S Vokal Reihenfolge Java Basics - Anfänger-Themen 1
C if Reihenfolge Java Basics - Anfänger-Themen 2
W String von hinten alle drei Zeichen abschneiden und in umgekehrter Reihenfolge ausgeben. Java Basics - Anfänger-Themen 9
F Reihenfolge des Quelltexts Java Basics - Anfänger-Themen 6
S Jede Reihenfolge einer zufällig langen Liste ausprobieren Java Basics - Anfänger-Themen 3
B AffineTransform - Reihenfolge der Operationen Java Basics - Anfänger-Themen 3
B Methoden Logische Reihenfolge in Programmen? Java Basics - Anfänger-Themen 4
D Problem mit Initialisierung und Reihenfolge Java Basics - Anfänger-Themen 10
O Zwingende Reihenfolge von Methoden Java Basics - Anfänger-Themen 33
P Vereinfachte for-Schleife wird in umgekehrter Reihenfolge ausgewertet Java Basics - Anfänger-Themen 7
X Collections Reihenfolge bestimmter Objekte in einer ArrayList verändern Java Basics - Anfänger-Themen 2
S Buttons übereinander legen - Reihenfolge Java Basics - Anfänger-Themen 2
G Zahlen in zufälliger Reihenfolge ausgeben/speichern. Java Basics - Anfänger-Themen 2
R Reihenfolge im Konstruktor der Objekte Java Basics - Anfänger-Themen 13
L Properties Reihenfolge vorgeben Java Basics - Anfänger-Themen 13
N Reihenfolge von Methoden Java Basics - Anfänger-Themen 5
F Reihenfolge in der Events abgearbeitet werden Java Basics - Anfänger-Themen 2
A Wörter umgekehrten Reihenfolge ausgeben Java Basics - Anfänger-Themen 3
A Reihenfolge bei equals() Java Basics - Anfänger-Themen 2
K Reihenfolge Modifikatoren Java Basics - Anfänger-Themen 6
U Zuweisungen - Reihenfolge Java Basics - Anfänger-Themen 9
S Falsche Reihenfolge von Methodenaufrufen Java Basics - Anfänger-Themen 8
G Array Reihenfolge ändern Java Basics - Anfänger-Themen 6
M Reihenfolge von Objekten im Vektor Java Basics - Anfänger-Themen 3
A Liste von Listen mit fester reihenfolge Java Basics - Anfänger-Themen 6
P Frage zu OO (Reihenfolge der Klassen) Java Basics - Anfänger-Themen 2
G Feld in umgekehrter Reihenfolge an zweites Feld übergeben Java Basics - Anfänger-Themen 5
T Reihenfolge von Strings prüfen Java Basics - Anfänger-Themen 3
B Stack mit Strings in zufälliger Reihenfolge füllen Java Basics - Anfänger-Themen 4
K Array umgedrehte Reihenfolge Java Basics - Anfänger-Themen 2
M String Reihenfolge umkehren Java Basics - Anfänger-Themen 2
M Array anders sortieren, aber die Reihenfolge beibehalten Java Basics - Anfänger-Themen 4
N Zahlen einlesen und in umgekehrter Reihenfolge ausgeben Java Basics - Anfänger-Themen 5
D Array in umgekehrter Reihenfolge Java Basics - Anfänger-Themen 4
A Reihenfolge erfassen Java Basics - Anfänger-Themen 11
A String Zeichen löschen in einer bestimmten Reihenfolge Java Basics - Anfänger-Themen 25
G Zahlen in umgekehrter Reihenfolge ausgeben Java Basics - Anfänger-Themen 6
A Exception Reihenfolge Java Basics - Anfänger-Themen 3
M Sorry,ne blöde Frage Focus setzen und Focus Reihenfolge Java Basics - Anfänger-Themen 15
L Reihenfolge der Methodenaufrufe Java Basics - Anfänger-Themen 6
E Select nimmt nicht alle Where /AND befehlen an Java Basics - Anfänger-Themen 4
D Kleine Probleme mit Split-Befehlen Java Basics - Anfänger-Themen 5
N Erste Schritte Dedicated Server \ Senden und Empfangen von Daten/Befehlen Java Basics - Anfänger-Themen 2
J 2 Fragen zu Befehlen Java Basics - Anfänger-Themen 9
M Maximale Anzahl von add-Befehlen? Java Basics - Anfänger-Themen 11
G Liste mit Java-Befehlen? Java Basics - Anfänger-Themen 7
Z Liste von Java-Befehlen? Java Basics - Anfänger-Themen 8
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
D Ist Ableiten hier sinnvoll Java Basics - Anfänger-Themen 5
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
B Dekorator Muster - Irgendwas stimmt hier doch nicht? Java Basics - Anfänger-Themen 4
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
H BlueJ: was genau ist hier der Fehler? Java Basics - Anfänger-Themen 14
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
M Was wird hier genau getestet? Java Basics - Anfänger-Themen 9
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
M Kann mir jemand hier die Logik vermitteln? Java Basics - Anfänger-Themen 3
M Wie kann ich hier den Abstand ausgeben? Java Basics - Anfänger-Themen 3
S Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt? Java Basics - Anfänger-Themen 23
P Weswegen entstehen hier Syntaxfehler? Java Basics - Anfänger-Themen 3
J Wie kann ich hier eine While schleife einbauen? Java Basics - Anfänger-Themen 3
A Wieso bekomme ich hier zwei unterschiedliche Ausgaben? Java Basics - Anfänger-Themen 6
S Was für Aufgaben könnten sich hier hinter verbergen? Java Basics - Anfänger-Themen 5
R Warum werden hier nur die grün und orangen Linien ausgegeben und der Rest unten nicht? Java Basics - Anfänger-Themen 5
R Wie würde hier die if-Anweisung aussehen? Java Basics - Anfänger-Themen 18
S Operatoren i=i++; Was passiert hier? Java Basics - Anfänger-Themen 21
G Warum ist hier ein Lamda-Ausdruck möglich Java Basics - Anfänger-Themen 2
O Was bedeutet das hier 999_983? Java Basics - Anfänger-Themen 2
F Warum ist die Ausgabe hier 1? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben