/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Langsom JLabel opdatering
Fra : Troels Frimor


Dato : 26-04-01 08:01

Hvorfor opdaterer foelgende ikke label'en foer den goer ind i alle
loekkerne, og hvordan kan man goere saa den bliver opdateret foerst?

JLabel ting = new JLabel("ting");
<kode kode>...
public void
rtTing(){
ting.setText("ting og sager");
metodeMedEnMasseLoekker();
ting.setText("ting done");
}

Altsaa ovenstaaende resultere i at 'ting' ALDRIG har teksten "ting og sager"
Hvordan loeses det nemmest?


Hilsen
Troels




 
 
Lars Dam (27-04-2001)
Kommentar
Fra : Lars Dam


Dato : 27-04-01 13:25

On Thu, 26 Apr 2001 09:01:21 +0200, "Troels Frimor"
<u002625@daimi.au.dk> wrote:

>Hvorfor opdaterer foelgende ikke label'en foer den goer ind i alle
>loekkerne, og hvordan kan man goere saa den bliver opdateret foerst?
>
>JLabel ting = new JLabel("ting");
><kode kode>...
>public void
>rtTing(){
> ting.setText("ting og sager");
> metodeMedEnMasseLoekker();
> ting.setText("ting done");
>}
>
>Altsaa ovenstaaende resultere i at 'ting' ALDRIG har teksten "ting og sager"

Det er fordi at alle paint()'s bliver gemt og sendt afsted samtidt af
hensyn til performance. Teknisk set vil din første streng blive
overskrevet af din anden streng rimeligt hurtigt - grafik manageren
(eller hvad det nu hedder) finder ud af at det så ikke er nødvendigt
at tegne den første streng, og derfor spares der så tid. Ganske normal
opførsel i alle GUI systemer.

>Hvordan loeses det nemmest?

Du kan tvinge GUI manageren til at repainte dine komponenter ved at
fyre en 'repaint' afsted. I.e.:

ting.setText("ting og sager");
ting.repaint();
:
:

Dog kan det være det ikke virker, da GUI manageren måske først
repainter, når din tråd returnerer fra den event der kaldte repaint().

Så for at få det til at virke efter din hensig, så skal du først sætte
tekst 1, så lave en ny tråd til din opgave, og starte den. Derefter
returnerer den originale tråd og din tekst paintes mens din arbejds
tråd kører. Når din arbejds tråd er færdig sæt så teksten til tekst 2,
og den skulle blive repaintet når den tråd så er færdig.


>Hilsen
>Troels

vh. ld

--
"Time is the fire in which we burn"

Brian Matzon (27-04-2001)
Kommentar
Fra : Brian Matzon


Dato : 27-04-01 13:32

> Du kan tvinge GUI manageren til at repainte dine komponenter ved at
> fyre en 'repaint' afsted. I.e.:
>
> ting.setText("ting og sager");
> ting.repaint();
> :
> :
>
> Dog kan det være det ikke virker, da GUI manageren måske først
> repainter, når din tråd returnerer fra den event der kaldte repaint().

Alt. kan man force en paint her og nu ved følgende "trick":
ting.paint(ting.getGraphics());

/Brian Matzon



Lars Dam (27-04-2001)
Kommentar
Fra : Lars Dam


Dato : 27-04-01 14:11

On Fri, 27 Apr 2001 14:32:18 +0200, "Brian Matzon" <brian@matzon.dk>
wrote:

>> Du kan tvinge GUI manageren til at repainte dine komponenter ved at
>> fyre en 'repaint' afsted. I.e.:
>>
>> ting.setText("ting og sager");
>> ting.repaint();
>> :
>> :
>>
>> Dog kan det være det ikke virker, da GUI manageren måske først
>> repainter, når din tråd returnerer fra den event der kaldte repaint().
>
>Alt. kan man force en paint her og nu ved følgende "trick":
>ting.paint(ting.getGraphics());

Det er selvfølgeligt rigtigt. Men svjv, så er getGraphics() en dyr sag
at kalde, så det er ikke noget man gør for tit. Men selvfølgligt, så
kan det være nødvendigt :)

>/Brian Matzon

vh. ld

--
"Time is the fire in which we burn"

Brian Matzon (27-04-2001)
Kommentar
Fra : Brian Matzon


Dato : 27-04-01 15:35

> >Alt. kan man force en paint her og nu ved følgende "trick":
> >ting.paint(ting.getGraphics());
>
> Det er selvfølgeligt rigtigt. Men svjv, så er getGraphics() en dyr sag
> at kalde, så det er ikke noget man gør for tit. Men selvfølgligt, så
> kan det være nødvendigt :)

Hmm det har jeg aldrig hørt. Men det kommer an på hvor krævende
peer.getGraphics() eller parent.getGraphics() er.
Er der nogen der ved noget om det?

/Brian Matzon

kode til getGraphics (1.1.x)
--8<--8<
/**
* Creates a graphics context for this component. This method will
* return <code>null</code> if this component is currently not on
* the screen.
* @return A graphics context for this component, or <code>null</code>
* if it has none.
* @see java.awt.Component#paint
* @since JDK1.0
*/
public Graphics getGraphics() {
if (peer instanceof java.awt.peer.LightweightPeer) {
// This is for a lightweight component, need to
// translate coordinate spaces and clip relative
// to the parent.
Graphics g = parent.getGraphics();
g.translate(x,y);
g.setClip(0, 0, width, height);
g.setFont(getFont());
return g;
} else {
ComponentPeer peer = this.peer;
return (peer != null) ? peer.getGraphics() : null;
}
}



Lars Dam (30-04-2001)
Kommentar
Fra : Lars Dam


Dato : 30-04-01 08:29

On Fri, 27 Apr 2001 16:34:39 +0200, "Brian Matzon" <brian@matzon.dk>
wrote:

>> >Alt. kan man force en paint her og nu ved følgende "trick":
>> >ting.paint(ting.getGraphics());
>>
>> Det er selvfølgeligt rigtigt. Men svjv, så er getGraphics() en dyr sag
>> at kalde, så det er ikke noget man gør for tit. Men selvfølgligt, så
>> kan det være nødvendigt :)
>
>Hmm det har jeg aldrig hørt. Men det kommer an på hvor krævende
>peer.getGraphics() eller parent.getGraphics() er.
>Er der nogen der ved noget om det?
>
>/Brian Matzon
>
>kode til getGraphics (1.1.x)
>--8<--8<
> /**
> * Creates a graphics context for this component. This method will

--------^^^^^^^

Det er det jeg er bange for. Anyway, det kan også være at det er min
gamle hukommelse der roder rundt, og jeg tænker på device contects
ifm. windows - hvilket _skulle_ være en dyr sag (noget med at der kun
var et begrænset antal til rådighed som blev delt af alle processer -
men det er jo nogle år siden).

Anyway nysgerrig som jeg er søgte jeg lidt på getGraphics() hos sun,
og det afslørede noget spændende:

At kalder man getGraphics(), er man også ansvarlig for at dispose()
det!

led efter "disposing of a Graphics" på flg. url:

http://developer.java.sun.com/developer/Books/Graphics/index.html

Der står også lidt om hvordan Graphics contexts bliver lavet ved kald
til getGraphics() metoder.

vh. ld

--
"Time is the fire in which we burn"

Troels Frimor (27-04-2001)
Kommentar
Fra : Troels Frimor


Dato : 27-04-01 04:12


> Alt. kan man force en paint her og nu ved følgende "trick":
> ting.paint(ting.getGraphics());


Det holder ikke helt, da den gamle skrift ikke bliver fjernet...

Det kunne dog loeses let, ved det let stoerre kald af
"paint(getGraphics());" for at gentegne hele display'et!

Men mange tak!

Troels



Brian Matzon (28-04-2001)
Kommentar
Fra : Brian Matzon


Dato : 28-04-01 12:25

> Det holder ikke helt, da den gamle skrift ikke bliver fjernet...
>
> Det kunne dog loeses let, ved det let stoerre kald af
> "paint(getGraphics());" for at gentegne hele display'et!

Nope du skal bare lave en g.clearRect(...) i din paint metode...
Det er det der typisk bliver gjort i update metoden.
Så hvis du ikke har overskrevet nogen metoder i din JLabel kunne du prøve:
ting.update(ting.getGraphics());

/Brian Matzon



Unknown (27-04-2001)
Kommentar
Fra : Unknown


Dato : 27-04-01 16:30

Det kan også skyldes, at JLabel i sin paint metode tager højde for en masse
grafiske ting og sager (man kan have iconer mv. i sin label). dette medføre,
at den bliver meget tung i paint metoden. det kan betale sig, at skrive sin
egen version af JLabel, som kun håndtere de mest nødvendige operationer i
sin paint metode.

MK
"Troels Frimor" <u002625@daimi.au.dk> wrote in message
news:988307881.965934@angua.skjoldhoej.dk...
> Hvorfor opdaterer foelgende ikke label'en foer den goer ind i alle
> loekkerne, og hvordan kan man goere saa den bliver opdateret foerst?
>
> JLabel ting = new JLabel("ting");
> <kode kode>...
> public void
> rtTing(){
> ting.setText("ting og sager");
> metodeMedEnMasseLoekker();
> ting.setText("ting done");
> }
>
> Altsaa ovenstaaende resultere i at 'ting' ALDRIG har teksten "ting og
sager"
> Hvordan loeses det nemmest?
>
>
> Hilsen
> Troels
>
>
>



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste