Avatar billede jonbdk Nybegynder
03. maj 2004 - 13:03 Der er 6 kommentarer og
2 løsninger

repaint og drawstring

Jeg indsætter et "X" på min Gui for at markere en position på et kort.
Når jeg gør det igen, vil jeg gerne fjerne det først X, derfor repainter jeg inden jeg indsætter, men af en eller anden grund forsvinder mit kryds med det samme. Nogen gange kan jeg lige nå at se det bliver sat inden det forsvinder igen

    private void mapMouseClicked(java.awt.event.MouseEvent evt)
    {
    int xCoord = evt.getX();
    int yCoord = evt.getY();       
    Graphics g = getGraphics();
    repaint();
    g.drawString("X", xCoord,yCoord);   
    }
Nogen der kan forklare hvorfor mit ene (seneste) kryds ikke bliver der?
Avatar billede jakoba Nybegynder
03. maj 2004 - 13:22 #1
mon ikke du skal bytte de 2 sidste linier, så der først bliver repainted når dit x er tegnet på den graphic du henter med getGraphics

    private void mapMouseClicked(java.awt.event.MouseEvent evt)
    {
        int xCoord = evt.getX();
        int yCoord = evt.getY();     
        Graphics g = getGraphics();              // NOTE. se nedenfor
        g.drawString("X", xCoord,yCoord); 
        repaint();
    }

men du erklærer g som en lokal variabel i din mapMouseClicked metode. Hvordan skal klassens update metode vide at det er DET Graphics objekt du vil have tegnet ?

Det ville være rart at se koden til din metode getGraphics

mvh JakobA
Avatar billede jonbdk Nybegynder
03. maj 2004 - 13:45 #2
getGraphics kan ses i Java API
Når jeg repainter, forsvinder X'et netop, så det spiller ikke - men ellers tak for buddet.
Avatar billede jakoba Nybegynder
03. maj 2004 - 13:50 #3
Ups. getgraphics er en standad metode og returnere en reference.

referencen er til det graphics objekt der hører til den komponent, og indeholder det billede der blev tegnet sidst. det vil sige: inklusive det "X" du tegnede sidst.

Det er helt ok at lagre den refenece i en lokal variabel for en tid.

men replain ændrer ikke på indholde i det Graphics objekt. Når du een gang har skrevet et "X" så står det X i billedet.

så du må starte forfra hver gang. fx med
    drawImage( img, x, y, bgfarve, observatør );
se: http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Graphics.html

    private void mapMouseClicked(java.awt.event.MouseEvent evt)
    {
        int xCoord = evt.getX();
        int yCoord = evt.getY();   
        Graphics g = getGraphics();
        g.drawImage( ditBilde, 0, 0, farve, ? ); //jeg aner ikke hvad en observer er
        g.drawString("X", xCoord,yCoord);
        repaint();
    }
Avatar billede _carsten Nybegynder
03. maj 2004 - 15:27 #4
Hvis du kalder update(g) burde det virke

Et kald til repaint() garanterer ikke at det bliver udført med det, det sker når AWT "har tid"

    update(g);
    g.drawString("X", xCoord,yCoord);
Avatar billede _carsten Nybegynder
03. maj 2004 - 15:28 #5
En gang mere.

Et kald til repaint() garanterer ikke at det bliver udført med det samme, det sker når AWT "har tid"
Avatar billede jonbdk Nybegynder
03. maj 2004 - 16:26 #6
Update virkede - således:
{
    Graphics g = getGraphics();   
    update(g);
    g.drawString("X", xCoord,yCoord);   
}
Det er bare supernice - Carsten gider du smide et svar.
Avatar billede ulrikm Nybegynder
03. maj 2004 - 17:58 #7
Gentegning kan, udover at blive gjort på et tidspunkt efter et repaint kald, blive styret af et behov (fx ændring af størrelse på et komponent eller efter et andet vindue har været "inde over" dit vindue). Prøv at minimer og maksier efter der er tegnet et X og X'et vil forsvinde. Det ikke til at styre selv, med mindre man lægger tegnekode i paint metoden:

    private int xCoord;
    private int yCoord;

    private void mapMouseClicked(java.awt.event.MouseEvent evt)
    {
        xCoord = evt.getX();// husk position til næste paint
        yCoord = evt.getY();// husk position til næste paint   
        repaint();// spørg ærbødigst om en paint på et senere tidspunkt
    }

    public void paint( Graphics g )
    {
        g.drawImage( ditBilde, 0, 0, farve, this );
        g.drawString("X", xCoord,yCoord);
    }

- update fjerner det tidligere tegnede og kalder derefter paint - dette er normalt ikke nødvendigt, hvis man tegner på hele overfladen, og update kan med fordel derfor laves som nedenfor for at undgå "blink":

  public void update( Graphics g )
  {
      paint(g);
  }
Avatar billede _carsten Nybegynder
03. maj 2004 - 20:05 #8
Et svar.
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