webForumDet fria alternativet

Förhindra radering när man flyttar fönstret + flicker

7 svar · 406 visningar · startad av nitro2k01

nitro2k01Medlem sedan aug. 20037 630 inlägg
#1

Hej!
Jag har skapat en JPanel som jag ritar på mha line och andra metoder. Detta funkar fint. Men när jag flyttar fönser så att programfönstret täcks av ett annat fönster så försvinner det jag har ritat på fönstret. Inget konstigt med det, men går det att förhindra?
Alternativt att sätta på någon slags dubbelbuffring så att det inte blinkar när paint anropas för att rita om fönstret.

Finns det för övrigt något sätt att avgöra om paint-metoden kallas från repaint eller från att fönstret faktiskt behöver ritas om för att något annat fönster dras över det.

spangoMedlem sedan juni 20006 147 inlägg
#2

Dubbelbuffring kan fås till i Swingkomponenter genom att använda JComponent.setDoubleBuffered(true).

Vad gäller fråga två kan jag meddela att paint (typ) aldrig anropas från repaint. repaint används för att schemalägga ommålningar, det tvingar inte fram dem.

nitro2k01Medlem sedan aug. 20037 630 inlägg
#3

Va?

Spango, är du helt säker på det du säger?
Ang. ditt första svar:
setDoubleBuffered verkar inte över huvud taget finnas? Jag har en klass som subklassar JFrame (Sa jag Jpanel...?) som borde sub-klassa JComponent. Och därmed borde det gå att skriva setDoubleBuffered(true); i konstruktorn till min klass, precis som jag skriver setSize(500,500); eller setVisible(true);?
Eller funkar den inte för JFrame? (Har ont om tid så jag hinner inte kolla nu.)

Ang. ditt andra svar:
Jag använder repaint så här:
Jag fångar muskoordinater som jag skriver till variabler, sedan kallar jag på repaint som verkar kalla på paint som sedan skickar med ett Graphics ocjekt som jag ritar med hjälp av.
Det verkar funkar varje gång, eller menar du att det är osäkert, att paint inte kallas på varje gång, så att data riskerar att inte ritas ut?

spangoMedlem sedan juni 20006 147 inlägg
#4

JFrame är ingen JComponent, prova att anropa dinframe.getRootPane().setDoubleBuffered() eller nåt liknande.

Och ja, repaint är oftast ganska snällt mot en, men det finns ingen garanti att ett anrop i repaint direkt resulterar i ett underanrop till paint... äh :) Vad jag vill ha sagt är att nej, det finns inget (renhårigt) sätt att kolla om man själv har framkallat anropet till paint eller om det kommer någon annanstans ifrån.

nitro2k01Medlem sedan aug. 20037 630 inlägg
#5

Det skulle varit skönt med typ:

void paint(Graphics g){
  if (g.isForced()){
  }
}

Hoppas på för mycket...

spangoMedlem sedan juni 20006 147 inlägg
#6

Fast det är väl egentligen inte det du har problem med, eller hur? :)
Hur som helst, det finns stöd för active rendering, d.v.s. att du ritar när du själv behagar i stället för att vänta på att Swing ska låta dig göra det, från och med Java 1.4. Jag har försökt sätta mig in i hur det funkar men aldrig kommit nån vart, om du vill kan du börja här:
http://java.sun.com/docs/books/tutorial/extra/fullscreen/rendering.html

nitro2k01Medlem sedan aug. 20037 630 inlägg
#7

spango skrev:

Fast det är väl egentligen inte det du har problem med, eller hur? :)

Jo, faktiskt! Jag samlar in musrörelser som jag sedan ritar upp på skärmen. När jag kallar på funktionen själv så ska den bara rita den senaste figuren. Däremot om systemet kallar på den så är det troligen nödvändigt att rita om hela figuren.

Men jag kollar på länken.

spangoMedlem sedan juni 20006 147 inlägg
#8

Annars kan du ju göra så att du har ett Graphicsobjekt (från t.ex. en BufferedImage) liggandes i bakgrunden, och sen ritar du upp på det när något ändras, och sen i paint (eller paintComponent som man egentligen ska använda) ritar du bara ut den Graphics:en (eller BufferedImage:n). En egen, lite mer specialiserad dubbelbuffring alltså. (Jag önskar jag kunde sluta använda så mycket paranteser, f.ö.)

Mer länkar:
http://java.sun.com/docs/books/tutorial/2d/images/doublebuffering.html

Genererad på 378 ms · cache AV · v20260730165559-full.f96bc7eb