Avatar billede javax Nybegynder
17. april 2001 - 18:39 Der er 6 kommentarer og
1 løsning

AWT har Canvas, mens Swing har ...??

Hej ;o)

Jeg er kommet ud for at skal tegne rigtigt meget (vha. drawLine,osv. i Graphics), og det skal gå MEGA stærk !

(free-hand-drawing)

For at gøre det, skal man helst bruge noget som er \"optimeret\" til at blive tegnet på, f.eks. Canvas i AWT, _men_ fandtes der noget tilsvarende i SWING ????

Jeg har selv kigget en del (også i bøger!!), men kunne ikke rigtigt finde til noget fornuftigt i Swing....


Jeg har prøvet at tegne på JPanel, og selve JComponent ... men går bestemt ikke lige så hurtigt som på AWT\'s Canvas !!!!

Lige nu bruger jeg Canvas, men det er ikke særlig smart at addere AWT komponenter på/til  Swing komponenter (JPanel)  ... der kan ske meget sjove ting, **gggg**, f.eks. menues som forsvinder under rå AWT komponenter ....

håber der er nogle java-hackerz herude !!!
please help !!!

mvh,
aRslan
Avatar billede codemon Nybegynder
17. april 2001 - 19:51 #1
Der findes ikke noget Swing-canvas. Hvis du har problemer med opdateringshastigheden kan du bruge et gammelt programmør-trick.

Lad en metode huske musepositionerne fra mouseDragged, opdater positionerne løbende og lad evt. din repaint og mouseDragged køre i hver sin tråd, repaint så kun når den seneste repaint er opdateret.

Så bliver optegningen \"langsom\", men præcis. Har du generelt problemer med hastigheden så husk at bruge clipping og optegn kun den del der er nødvendig. Det kræver selvfølgelig at repaint ikke sletter hele skærmen.
Avatar billede mtilsted Nybegynder
18. april 2001 - 10:57 #2
Hvorfor ikke bare bruge en awt canvas??
Avatar billede javax Nybegynder
19. april 2001 - 21:42 #3
Codemon>>
http://www.javaperformancetuning.com/tips.shtml
http://www.cs.cmu.edu/~jch/java/speed.html

tak for dit svar, _men_ som sagt er der tale om free-hand-drawing, og netop i dette tilfælde må man ikke køre MouseListener/MouseMotionListener og optegningen af skærmen i 2 separate tråde.

Brugeren vil blive forviret hvis optagningen af bevægelsen \"halter\" efter cursoren !!

Generalt skal man ikke repaint()\'e (eksplicit kald til paint()) efter et drawLine kald o.l., men blot  optegne det nye på skærmen, ellers skal dit komponent optegnes MANGE gange og det resulterer i at skærmen flimrer, og det er irriterende og ikke til at se på !
man skal også huske at have en offScreenImage til paint()

hmmm, jeg har afprøvet clip, men det viser sig at være endnu langsomere, samt er det kun en lille brøkdel der overhoved kommer med på skærmen, resten er (spist) væk !!! strange !!!

se lige på min kode ... jeg gør ikke noget wrong, well ?

//et stykke kode, x1 & y1 er klassens lokale variabler ... Graphics g_tmp er også en lokal variabel
public void mouseDragged(MouseEvent e) {
      switch (mode) {
   
    case PENCIL:
     
      if(perfWatch) {
        j++;
        t1=System.currentTimeMillis();
      }
     
      x2=e.getX();
      y2=e.getY();
g_tmp=((bCanvas)e.getSource()).getGraphics();
      x_lenght=x2-x1;
      y_lenght=y2-y1;
      g_tmp.clipRect(x1,y1,x_lenght, y_lenght);
      g_tmp.drawLine(x1, y1, x2, y2);
      g_tmp.setClip(null);
      x1=x2;
      y1=y2;
}}
Avatar billede javax Nybegynder
19. april 2001 - 21:47 #4
hmmmm, der mangler break; i det viste stykke kode!  jeg har klippet det væk, sammen med det andet, for ikke at det skal fylde hele siden.

d;-)
Avatar billede javax Nybegynder
19. april 2001 - 21:50 #5
mtilsted>> hmmm, resten af GUI\'et er lavet i Swing !

f.eks. JMenu\'et forsvinder under AWT\'s Canvas ....
Avatar billede codemon Nybegynder
21. april 2001 - 21:43 #6
Der er ikke noget galt med din kode. Ved free-hand drawing som din er der selvfølgelig ingen grund til at bruge clipping, du har jo ikke noget som skal genoptegnes.

En hurtig test viste dog at getGraphics() - metoden er temmelig langsom, ca. 10 - 20 gange langsommere end drawLine. Du kan prøve at gemme dit g_tmp globalt en gang for alle og se om det giver en mærkbar hastighedsforøgelse.

codemon
Avatar billede javax Nybegynder
23. april 2001 - 09:39 #7
codemon>> nej, det gør det ikke !

det var det første jeg prøvede !!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester